{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd \n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1 分析用户表"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###  1 读取数据\n",
    "###  2 分析列名"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>User-ID</th>\n",
       "      <th>Location</th>\n",
       "      <th>Age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>nyc, new york, usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>stockton, california, usa</td>\n",
       "      <td>18.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>moscow, yukon territory, russia</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>porto, v.n.gaia, portugal</td>\n",
       "      <td>17.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>farnborough, hants, united kingdom</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   User-ID                            Location   Age\n",
       "0        1                  nyc, new york, usa   NaN\n",
       "1        2           stockton, california, usa  18.0\n",
       "2        3     moscow, yukon territory, russia   NaN\n",
       "3        4           porto, v.n.gaia, portugal  17.0\n",
       "4        5  farnborough, hants, united kingdom   NaN"
      ]
     },
     "execution_count": 75,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user =  pd.read_csv('./data/BX-Users.csv',sep=';')\n",
    "df_user.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>nyc, new york, usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>stockton, california, usa</td>\n",
       "      <td>18.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>moscow, yukon territory, russia</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>porto, v.n.gaia, portugal</td>\n",
       "      <td>17.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>farnborough, hants, united kingdom</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id                            location   age\n",
       "0        1                  nyc, new york, usa   NaN\n",
       "1        2           stockton, california, usa  18.0\n",
       "2        3     moscow, yukon territory, russia   NaN\n",
       "3        4           porto, v.n.gaia, portugal  17.0\n",
       "4        5  farnborough, hants, united kingdom   NaN"
      ]
     },
     "execution_count": 76,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user.columns = ['user_id','location','age']\n",
    "df_user.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "####  分析location"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [],
   "source": [
    "location_value_counts  = df_user['location'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "57339"
      ]
     },
     "execution_count": 78,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "location_value_counts.count()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 平均每个地区存在的用户数 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "user_id     4.863322\n",
       "location    4.863322\n",
       "age         2.931617\n",
       "dtype: float64"
      ]
     },
     "execution_count": 79,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user.count() / location_value_counts.count()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 由上可知，每个地区所代表的人数过少，需要缩小地区的大小，以便于更好的区分"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0                usa\n",
       "1                usa\n",
       "2             russia\n",
       "3           portugal\n",
       "4     united kingdom\n",
       "Name: location, dtype: object"
      ]
     },
     "execution_count": 81,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user['location'] = df_user['location'].apply(lambda location: location.rsplit(',',maxsplit=1)[-1])\n",
    "df_user['location'].head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>18.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>russia</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>portugal</td>\n",
       "      <td>17.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>united kingdom</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id         location   age\n",
       "0        1              usa   NaN\n",
       "1        2              usa  18.0\n",
       "2        3           russia   NaN\n",
       "3        4         portugal  17.0\n",
       "4        5   united kingdom   NaN"
      ]
     },
     "execution_count": 82,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "709"
      ]
     },
     "execution_count": 83,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(df_user['location'].unique())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       " usa               139711\n",
       " canada             21658\n",
       " united kingdom     18538\n",
       " germany            17043\n",
       " spain              13147\n",
       "                    ...  \n",
       " u                      1\n",
       " faroe islands          1\n",
       " italien                1\n",
       " mauritius\"             1\n",
       " citrus.                1\n",
       "Name: location, Length: 709, dtype: int64"
      ]
     },
     "execution_count": 84,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    " df_user['location'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {},
   "outputs": [],
   "source": [
    "location_value_counts = df_user['location'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x1f1df492dc0>]"
      ]
     },
     "execution_count": 86,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(\n",
    "    range(len(df_user['location'].unique())),\n",
    "    location_value_counts\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAeYAAADnCAYAAADLuPXeAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAB5G0lEQVR4nO2dd3gc1dXG3zMzW1VWvdiyLffeezc9YGogCSEkhgQCCaEFSBSSgPmSEKcSCD2EAAESCB2LEEjA3cbdlm25SZZtWbJ617aZOd8fd9Zay+qWvJJ9f8+jR7szd2bu7kr7zjn3FGJmSCQSiUQi6R0okZ6ARCKRSCSSJqQwSyQSiUTSi5DCLJFIJBJJL0IKs0QikUgkvQgpzBKJRCKR9CKkMEskEolE0ouQwiyRSCQSSS9CCrNEIpFIJL0IKcwSiUQikfQipDBLJBKJRNKLkMIskUgkEkkvQgqzRCKRSCS9CCnMEolEIpH0IqQwSyQSiUTSi5DCLJFIJBJJL0IKs0QikUgkvQgpzJLThojqwx5fR0QvWY+/QkS7iGgHEa2ytmUS0Woi2mr9zInQtCUSiaRXokV6ApKzmocAXMLMx4goztpWCuAiZvYR0XAA/wAwLVITlEgkkt6GFGZJT7IWwEtE9CaAd6xtNgBPEtEkAAaAERGam0QikfRKpDBLugMOe+w8sZH5diKaCWAxgC1ENBXAnQBKAEyEWErxncmJSiQSSW9HrjFLuoMSIhpNRAqAa0IbiWgoM3/BzA8BKAMwAIAHQDEzmwC+CUCNyIwlEomklyKFWdIdZAFYDmAdgOKw7b8johwi2mXt2wHgaQBLiGgHgFEAGs70ZCUSiaQ3Q8zc/iiJRCKRSCRnBGkxSyQSiUTSi5DCLJFIJBJJL0IKs0QikUgkvQgpzBKJRCKR9CJkHrOk28nMyrYD6Nfsp3/Y40QAdohiIzaIv0MTouCIbv1UATgOEeXd0u/jBcsWG2fsRUkkEskZQkZlS06LzKzsFIiSmqGfKRDiSz18aT+AXQC2ANhq/ewsWLbY38PXlUgkkh5FCrOkw2RmZTsAzAcwE0KEp0IUDekt6AD2QIj0ZgCfFCxbfCCyU5JIJJLOIYVZ0iaZWdmJAC4HcCWASwBERXZGnWYfgA8hCqCske5viUTS25HCLDmFzKzsoQCusn7m4uwpm1kF4N8QQv1xwbLF1ZGdjkQikZyKFGYJACAzKzsZwM0AvgVgbISncyYIAvgIwAsA/i0taYlE0luQwnyOk5mVfT6A2wBcDREpfS5SCOBvAJ4vWLa4MNKTkUgk5zZSmM9BMrOyXRCdne4GMCbC0+lN6ADeBfB4wbLFayM9GYlEcm4ihfkcIjMrOwHADwHcDpFLLGmdLQD+r2DZ4g8iPRGJRHJuIYX5HCAzK9sJYR1nAYiL7Gz6HOsAZBUsW7w60hORSCTnBlKYz2Iys7JVADcBWAogI6KT6ft8BOAnBcsW74z0RCQSydmNFOazlMys7CsBPIpzI8L6TMEA/gHg5wXLFudHejISieTsRArzWUZmVvZUAH8CMC/CUzmbCQJ4EsDPCpYtboz0ZCQSydmFFOazBKtxxEMAfgzZnORMcRDAt+X6s0Qi6U6kMJ8FZGZlTwLwMoAJEZ7KuQgD+DPE+rO0niUSyWkjhbkPk5mVrQF4EMDPINonSiJHHoT1vCrSE5FIJH0bKcx9lMys7LEQVvLUSM9FcgIG8BREelVDpCcjkUj6JlKY+yCZWdl3A/gNAEek5yJpkX0AripYtnhfpCcikUj6HlKY+xBWgNczAL4d6blI2qUGwPUFyxZ/HOmJSCSSvoUS6QlIOobV/el/kKLcV/AAyM7Myr4/0hORSCR9C2kx9wEys7InAPgAwKBIz0XSJf4O4LsFyxb7Ij0RiUTS+5HC3MvJzMq+CsCrAKIjPRfJabERwDUFyxYXRXoiEomkdyNd2b2YzKzsn0C0IZSi3PeZAWBzZlb25EhPRCKR9G6kxdxLyczKfgzAPZGeh6TbqQbwpYJli7+I9EQkEknvRApzLyMzK5sg6jB/P9JzkfQYdQAWy1KeEomkJaQruxdhifJzkKJ8thMD4OPMrOzzIz0RiUTS+5DC3Lt4GsCtkZ6E5IzgBvBhZlb2/EhPRCKR9C6kMPcSMrOy/wDg9kjPQ3JGcUPkOs+K9EQkEknvQQpzLyAzK/v/APww0vOQRISQW3tipCcikUh6BzL4K8JkZmXfAuAvkZ6HJOIcATC9YNni0khPRCKRRBYpzBEkMyt7DoDPAdgjPRdJr2AtgPMLli0ORHoiEokkckhXdoTIzMrOAPA2pChLmpgL0aREIpGcw0hhjgCZWdlOiIpeaZGei6TX8W2rradEIjlHkcIcGf4CYFqkJyHptfwhMyv7okhPQiKRRAYpzGcYqw3gjZGeh6RXowJ4IzMre3ikJyKRSM48MvjrDJKZlX0BgP9AfPFKJO2xC8BUGQwmkZxbSIv5DJGZlR0L4CVIUZZ0nHEAHo70JCQSyZlFCvOZ4/cAMiI9CUmf48eZWdkyHkEiOYeQruwzQGZW9oUAPo30PCR9lj0AphQsW+yP9EQkEknPIy3mHiYzKzsawAuRnoekTzMGwCORnoREIjkzSGHueX4DYFCkJyHp89yfmZU9M9KTkEgkPY90ZfcgmVnZiwB8BoAiPBXJ2UEuhEvbF+mJSCSSnkNazD1EZla2C8KFLUVZ0l2MBvCTSE9CIpH0LFKYe467AAyN9CQkZx33ZWZlp0Z6EhKJpOeQwtwDZGZlxwH4caTnITkriQLw80hPQiKR9BxSmHuGBwDER3oSkrOW72ZmZUtvjERyliKFuZux3IyyO5CkJ7EB+GWkJyGRSHoGKczdz88g3I0SSU/ytcys7CmRnoREIul+pDB3I5lZ2ZkAvhvpeUjOCQjAryM9CYlE0v1IYe5eHgFgj/QkJOcMF2dmZZ8f6UlIJJLuRQpzN5GZlT0Mss+y5Mwjo/8lkrMMKczdx52Q76fkzHNxZlb2mEhPQiKRdB9SSLoBq1HFTZGeh+Sc5a5IT0AikXQfUpi7hyUAYiM9Cck5yzczs7Jl3rxEcpYghbl7+H6kJyA5p3ED+FakJyGRSLoHKcynSWZW9myIfrkSSSS5NdITkEgk3YMU5tPnlkhPQCIBMDYzK3tOpCchkUhOHynMp4EV9PXVSM9DIrGQN4kSyVmAFObT4xoA0ZGehERicXVmVrYW6UlIJJLTQwrz6XFFpCcgkYQRD2BepCchkUhODynMXSQzK9sG4OJIz0MiacaVkZ6ARCI5PaQwd535ADyRnoRE0gzpxZFI+jhSmLvO5ZGegETSAsNkiU6JpG8jhbnrSGGW9Fak1SyR9GGkMHeBzKzsEQCGR3oeEkkryHVmiaQPI4W5a0hrWdKbmZWZlZ0c6UlIJJKuIYW5a1wS6QlIJG2gAJgb6UlIJJKuIYW5a0yL9AQkknaYGukJSCSSriGFuZNkZmUPApAQ6XlIJO0ghVki6aNIYe48kyM9AYmkA0hhlkj6KFKYO8+USE9AIukAKZlZ2RmRnoREIuk8Upg7j7SYJX0FaTVLJH0QKcydRwqzpK8ghVki6YNIYe4EmVnZKQD6R3oeEkkHkcIskfRBpDB3jkmRnoBE0gnGR3oCEomk80hh7hyDIz0BiaQTpGVmZVOkJyGRSDqHFObOkRbpCUgkncAGICnSk5BIJJ1DCnPnkMIs6WukR3oCEomkc0hh7hypkZ6ARNJJ+kV6AhKJpHNIYe4c0mKW9DWkxSyR9DGkMHcOKcySvoYUZomkjyGFuXNIV7akryGFWSLpY0hh7iCZWdkxANyRnodE0kn6lDAT0atEdGEXj8vsgSlJJGccKcwdJzHSE5BIukBURwYRUb31+79ExJ34MTs5vs0fAN8A8GkXjztERLq1zWhlbGnYvINEtC7seR0R5YSN1YkoYO3TrXM2WOMCRORr4X04SkSNYdc/RERFRPQt6/09Ym33W+fcSETLre2Gdc4KInrOGl9iXW83Ef2OiF4gojHNPrtpRPQEEb1ERA8T0cdEtJ2Ilnb2j4WI4ojo+822XUlEWUS0lIjub+W4RUS0PHx8O9d5iYiusx7/k4iGtzN+BRFlWu9tXKdeVB9ECnPH0SI9AYmkC9g6OX5sJ8f3tgImqvW7te+2ZOs3QfxPzw577gIwrtm5VAAmgEbrnG4A0RDvqyNsbOh9SADgBLAZAAMYBOG1+CsRHQIwwNr+KoBCAAaACdb2YxDLZQkAFhHR7rDrbWbmB5j5FmbeA5wQt98A+ADADQA81hxcAEZaY9admCBRq99hJLABiAPwfSK6iYietI7pB6CotWMtJgGY3s6Y1lgI4OdE1I+I3gqb01eIKJeIPg9tAlDKzNVdvA6I6PbQTVIr+28ioie7ev5m52r1RqbdY5m5O+Zw1pOZlT0SwN5Iz0Mi6SQrC5YtXtTeICKqZ+Zoy/qU9G5MtHzjYUKIV/jNkhfiBiT8Bk0H4Ie4sQiJNUPcJChh52YAuyFuGqKs8xYC2AZgGsRNjgKgAYAd4oaAAVRY5/JC3JTsBjAa4oalAuJmxwkgx3o80Rq/y9rusI4dZv3+CMDVAC4GsBLAQGYusQT2fuuaO5n5m0R0BYCfWfOpAPANZi5p680Mh4huAjCNmX/Q0WPaONdSAPXM/PvOHist5o4j3ytJX6Sjnh43yTXavkL4d5HZbHtzD4YLp3pNNAihDf1thARda3buBgCjICxxFULMBwEYAaDcOi8BiLGuQwCCEIKdDGHpOyGaqbitcycDuA1CfGdCeAs06/lb1rUyAAy0jkkEcDmAJwA8aM1rPxH9F8DfIJoKmQA+JqKHADwCYIi1fSSEZ+IE4VYsEd1FRHuIaCcR/bPZewQiuoKIviCibSSWeFLDzvGi5V7PJ6K7wo75KRHtJ6I11vXRkWs1R7pnO8i1yipOp4o1CkyoZEIBswKGAhMKTOsxswKTxDZmBSZUMEjsJ5VM0IkxzAo4bKx4HLYfBIYqtkEhPrEtfL8CJgIzieND20/stx5T6DGBQYTm26zHCG1TxDaE7ceJ7TjxGID4TQQGgNB+IoAgjiNru7UfCsIef+6KOrg3b2ZeaWzS0YBu+GyBYNCnBL0wFC+D/arOHFSJoJPuVxVmUgKqogcVjaCREvAa0WxqjQQ7TLfXrwAUDHIUoAfMgE0N2gKsKGatHnDDjDMBxec1atU4RJlBZgWmQ1fYZnpNryPKZF2lfJfdHFdXz0EHUYBsQQazggA5WOFGKIpmGKypBpuKqgRsmmE3g+xiNg2CboJUr8PG40sPG2wjznemwAw6wKyTXVN1e5ChqGwqpLLL8JFfs7FJdtMMsmaqzFHkg6nq7LW5Uc4eJabeZ8YbVVTtdJINmgFFJ51szIoKDTo3KG5T1RXEqvVsCwRhqAoaNTvI+pthEJ5z3RDs5J96a9aYpHfSHZ9VEE1u+QCEtQkIsa0DEGtdx2Vt1wD8GcDT1uNiCMHVcLJ7P8b6XQxgH4BM62cZhOjHQgh+6GbiQesaGoDVEJZ6PIAFAD6BuBGoRtPNxnIAKRBi/ASA863z3QBRijYIYAYRDWbmQy287iwAg5nZ38q69RoAs5iZiegWAD8CcJ+1bxSA86zXuI+InoG4ybgewq2vAdgKYEsHr3USUpg7yB/sz5oA5kV6HmcL+2y2/LtSk8tG7lFoeuXo+MT+qe6Dxo46lxFlRisqIxg0HbqbG906zGAQKoHJZGZF0QMExRHQzaCiGQlsmEHVbhqGSXaXwjAUkwiKrjoRNINQXAqTEgcyQMwKTJeJBNMAmU6GprBOoIDuIhsIUFQeBtMM2JyKyhR0KJoeJIPIUMkgYgcZKgCdDRdpBNNUFZOgwqtDATTTzgYcrNDBxCEM1smExqYDMEiFrjP8TgVMDCgm2HCDDBOEIEy7AtMg1LIdIBvYAIBq+ByMYnIAMOBjQEfAJBhK0LSxzmBHoEqBoiDANihQTNNgxWADumoCpgk1YOB6fmcFsPjzNj8MQciV2dvWjCUtw2j6rJrfTIXvCyfkvm5OEZoa9Jhhv2sgLGslbJsKIBfA/wHwQWjIATRF/4eWQkIWOKxzTEFTVkuGNRcGUAuxrh0E8AaARRBWtglhmQPAvyDWuV8HcCmE4A2xxikAnrOu92U0WdWhv2c7gOEAWhLmnQBeI6L3ALzXwv4MAG8QUbp1nvBzZDOzH4CfiEohYgPmA3iXmRsBgIg+6MS1TkIKc8fxR3oCZwPHVfX4PalJB3bb7XP6VUK9/SMj7vM5ow5MLG+oLxyfjpKKUn3sofpgxcDBXO46hqhCIEN3oCI+BUFbuan4TI5lDX6nA6riZ1tAZSepBLfJNaqdNdPLLl8jccAFhxIH3aGbDTZVNblRVxtVuA0dfpuLTBArxAwGswvstzEhqLM7YINdVdhUbdA1lTRTJ5ikK6apqAQKqqoJsALT5CgmIjiZVDATERGzJpwXRCYzE0CqwQyV4ASbpqEoTAYxsaYoiunUWScFzKoCxTChgzWTFVZUg1iBqRkUIJDCCoiD7DRMBYBJUKGwSqyBggoxWDdNBmtsqmywrrJCdjJVjoLiU+wjAHREmL3MfJRI6nKE0dHy93IDTo6wD6LJsm1Ak3Vag6YgsOYCHR4/EHJfGxACBOuxETaGrHM7rPGPQazpjoCwWEPzDAXQBSAs7EQAVWFzKgVQD2FRAidb3x9ACGrIAl4A4CoAv7TmyxDr2X5rLrAe11lz/R+EZfsfANshgvQehLDgrwJQw8yfoGUWW9e7AsBPiah5m9Q/A/gjM39ARIsALA3bF64HBtrX0lOuxcx6a4OlMHecQKQn0JepVajmJ8lJ21e5nDNANN8eZO9vXjR89VH9y001Ku1g7erGiwquHvDm1I93r1HSnXOLPg6mVi/SfWNs2BLvgFady8MOBcjlT+GYqEQcGmBDQPMb9cF82KsdHF9mw1DVS40et1kWlUGUUAlvsMYkHxRnow1q0K25HfVc7Y5mMBFUPyPoJ8WwsaEb5AnaQGQn006mj5yskQ9qMACn4QQpdicpJoIu1lmxkY4GUoO6YQZscBmq4lD83KjaWSHNNJUAiJlYV6CZAJGKgKKCmYnsMKGzYrJKuglTY6dqB7NhI/jgYIcWgI4gKUHdzrCZigmKJhtMBkhjM6jZFZ2I7BxkA4ap6KzY2cbEmqqxYjIT2G7YDE2B17SRHTqizICn/U9H0oto7Tu5edpb+LpxTNjj8M+7+V2Ws9m+cKsWaArKAoR4xkEIIFvP77H2JUEEZcVZzw1rjB1ClHWcbMGrAP4BIeihtebjEFb2tRBr0UEId3Q/CKH1hZ37mzjVZf8+gBkAroEICvuqtf0fAH5rjd8KwEVEUczcEH4wESkABjDz59Z68PXWPMLxQETKA8AStM8qAC8R0a8h3tcrADzXxrWqWzuRFOaOIy3mLhAA/MsS4ze8FRM9gYkWhrb/8hVji0PHvEOD568kUkdV+ItGxJtRxcN3ZUY1zizU3zRvtt2a+Htq3DGlYa5zEnh4Jj6fH8tqTQ3iyr7AsAMMn7e/mq6NoUAKuHJEgLfbPWznfWzU7eT4Y06KbwhyNBIZthhCksEFCYPJSybsahk3BqoQXQNmfxQleBkeGGCnYfrtNi3o8KBBS4RTKecaWyPZ60oZQQeoUdVsfo0Tgy44QDaHqxFVziiuoxSyEUyv3Q9FD8BmqCCQqWp2MhFkm8OkWnKDdJdps9WxK+BVFFYZug12coIJpsNuUp0aDZX87Hd6FdXvUzS/g1lvhJM1sO5QnZrOPqeTG1SnYueAEnD4oAQbSdFV0nVNdZrMjoDCZkDhKCVIQYeT/LYos63PJwQzh76UWnODSnqejr73DPF9ZIdwQ6egKRArHC+EZVoNsZ5bBWH9RoWN9UEEXV2HJgu82Bq/2xo73NrXCCG6TzPzUiK6A8CTEFa6AnGDELDO6beO3QDhJv8FhN4EIUR5L5qCwwwIAVwC4BUI97YGIfylEOu5oe/f6yGs9l8A+BOAyWhKafsLgK8DqAyb9260rHMqgFeJyGO9F08wc3Uzj9FSAP8ioioAn6HJ3d8izLyViN4AsMOa96a2rtXWuWS6VEdZ6omCcMdIOoAJmH/xxK5/Jt6TaRD1D993/Upj9ZfX8XwAWDPn11v9mjbIX/Ns4oXp31wd60yZ/F7SO7nbJqbW7No0gp4zHrSvOu6sSTp+CaIS0wwMaMT2kbXY0jgUk8t2ILpuC6cdjULQOx5uiiFP3AAOeqpQP8BvfuGONw1fNUeZx6CVVmBgiQ6n7oIejEEyMuCLcYBSqrg4wUlFWgLDqIEDx9hr1MFdoiO6zs1uvx/xpo1ISTR11UFR7gCqEt1U4oo2a1mhBKqDV61EPVcjttYLrcHJ5IuF3RegaN2Eh1wIKk4YNoUdTp3q3LFc7ohBQDFNO1XBrzTC6dMB0wY9GGS7qcJh2tgklVRNZy/ZYCpkutGgNBIbtoChaLqN2VShkgIbqTA0k9nupwbVAS87yGkGTVCjohmNpt2v77hv2et/6ujnJtOlukTo5ocgxC8KJ6/lGgAOoilKNzytaQdEgFMGTrYK/RBrmqOs56HP5RiEpXkEYp33SQCPQ1iVidZ2AlBgnbfTaUNE9HsAF0KI5icA7uYeFAoiuhnA39ty7Z5rSGHuDEs9DZBlOdvlg+ioTf+XGB/nV5RTqvmMOsq5j7xqDCHAYSj2xpXz/6gy+/3+mqdjB0eP3zgj+bIZu9Qj648Nfdv856ArAvkbUpS3/Q/Sp+4af8basXpd9DTu54llb7qB4pG7+T/OmYp2GOaChmyGLw8x+QmwB2ZTkIljPCkU53IrvrhGo6Ffubnek6Af8zppiPcYfHopkkuOYmBFgFkfgIaAE2mcRpo7iRuiTdgTi1CTYMOhqCQcDaicpJcjistQbvg4saQOidU63MEoaEGdCQlwUzJUcrAZYxASGlEWa0eZPZqrzChEoZocZgkatHo2gl5ElwfhqLOxO+BSnAHAZvpYM12kKglQyQ0iFVpMgH2xzJVR0ahRbeRjmFHUiKDmhc+sY3tDo0m6Q1EDCiu6AmcwGjZDYafihWb3kc/tNGvgpKCprnnkkWXPdfSzO8eF2QtRGGS+9Ty03mtAiOkhiKAjgnC3LoSw/pLQVNjkAwgX5p0ALrLGD4BwA79ojTsG0RBHhcjlHQVgPYBPIYT0qxAiGwPhSq6GsC4JQJ41pzuYebP1eV0J8b30hDWHzQDuBpAXFlE8mplDEcWSXo50ZXeOQ+h8ZaRzhi+cjt33pSQFa1S1xQpA0V6ufuh1I4Ysa6I0edIeEE0DVBMAjjTkjpuedKlvnDFw9vbDU7fekfSUuXTWI8qVG39n/L7+z7bEeZsSD+bnVyQXLqbSBocxqmQK0pKDXDd8lbJi1FxsKfwerrV/ZqRrq6i6sQrm/gQyK+exrzRWCxzW6DKX3W5zu8jrSTfr+/n0TVPmm+8GkuGoC2BEfQEKzN2cXlGspFeYqK4axXoglkYFvZgRlQEzqj+8Dg9sSeUczEjk/aMSsQMuNPgUZOolsAcqzXKzgZKqytGvuI6jCmPJrcdwsq7CbcZzMlIo6BzEjW6CFldN3L8GZTHxKLJ5UGraAL2eU81yAMWopgBQH0BChVeNKwkg2Yxiu+lSyDDIZ6iscSzFIQN2xckBu431KB0U00g+t4FKl4dr1H6oZ6fpgldxo76xkx9j8yCjs4mQa7c5JoSL1QvhFob1vBaiChcA5AMogVgD3Q6RmmNAROPmQwhjOpqE+5fW+eIhvmf/ACH0KkQ6zQqI75IrIVyeo6zjGcIFWwjgQwjXcKh2+HetQKQVYXMPAFhuCTAAXMTMt1iBTP9pJaJY0suRwtw5pDC3wAGb7dBdqUklhTbbrFYHMfPvXjAOaGZT2b7i9DmWaKh2ADBYd3uN+s1uLWbapYHJnve3eYf8cs6Pjt8942nv/Zvuqv1WbXbgrv4vj75/+PKDX1+eYCtK+7reUJeHCVUXc5THwEVDX+DdMzK05+p/jqj8evN7I96gas9yLqpmztwdTd7KOSiLGkzVZZVa4uFY7Rp3qhp0R5u1seXsS2vwbY8fqawfep5ZVhWPEbXFNMy/iwuVQqRXfsYJpSrV1Y6FVpTKWtCk4a4gpkYlwLDr8DoSYE9Q2UxQOH9EOm0f60FFIMZUfQYN8paxPViNHbSH3XUVlFFeA0+RDUGzP6t6A9KCxzCGPezRUpSAOxMNTgJFVbM9tpx8AwgloxJwUHOhPKhB101O1SsozqzmA+Zx1CBAUbX1SkplLeKP++E0Y5AMD2INF3wGaaQTu2CvxZ2d+jhbEq6+RFvrtBMgUn0ITRZuAMBRCKtXgRDQx6zHXut8xRDfldMgLGQvhKULCAFPghD3gxDiGkpLyocQ2HEA/g4hkHdAVK9SIYT9I4ggI6/14wdQwMxDiGgoRKrQTQBeA/B/LeTABsPczOHRwW1FFEt6OVKYO4e86wyjRFVL7klJ2r/LYZ8NojYDI+5+31yVWI+F4dtqYgcPBAAiRYX1hXq0IbdxpGcGEjlmaD89ZWXu9gsyfj/lLs9dM/4S8/Lmy4/tr8qofd345ahfXevbp25/xjYrb6qWoxIrldvNKXXX6baD9Txi4OtUP85ve46uNw4XpNGX6lYb5034kLbFf6QcK3MYE3fYKM4/QyuI70c1jmKVio+YA48MirkuaijVOgmVMUcCgbScwL64eCXfORkrK9PYVmnSeQ1bOdbcTzX245xSXgu92AF/3Wg49UwY+YDP7kZmVBIm2qPgtwdVr4NZS9CgxAdwJDoReZmjsNrwcFVjNKIb/DzYW4pYvQhHKZ8puAXplbVIrNHJV5vBVcf6k6Jr7Akc44EURy53MpuuaPLaHdDtHthiq2CPrUN1ajKODY6mXYqLK4IO+AMqJ+tVlBqoZRiNVEMo6+TH2hdd2QwhjCGXcyiyOB9i7dYOIaC/sPYfsPZnWmN/AZEL+x6EVXwIIvjpWgjL9gpm3m5ZqnXMfAUAEJEfIsXnzwDuZ+bLiejvEGkxY5m5noiehxDfjyCCrABR8eoQAD8zjyGiHRDpPiMg8l1jiGgEhMtbBXA7gKcggq+mdPA96WxEsaQXIdeYO8NSz70A/hjpaUSaOqLaB5MTt61wu6aDqN019zl7zC13v29OprDglkZXypENMx8eGHruq/pjAIA9SosrvHzAbRkAEIRe/4pjZV3GoJ15rszjmffhSZu2tTJ3UEXhiE/tD9TnuCj4f7akwI/esAWLB97ceDwqoMWYBx1Tky/x7XFXGDXp69TowYfobed1+pbyiXbPwXL/bY3vYrpzrfpuPMyaYgct2Kyaif4JamnKfLPaBS2o5+pxiqkOiR5pxrkztON2L8pi8hqQutM8EhfNe9wjcLguA6Wl8TS9LpfnezdTwFFoVtorEVcShKvIAQoOg9MYDmIXNdj9TA4nJdljOdruIK+dudEJVuIqieIOmxUxQcp3paJYS+ZKbwyqamI53VvNI3yFSrxxxKxXKihANUipquPEygDpvhT2YyApwQS2B8GqznA449jpTibV4UJAC7BPC5ASXQd7bB0rTv8Pv/yDpzt8Q2k1Wsjs1B9EZGhEU7zHbggXckvWfh6EFeuCsEgPAiiDWOMdBmHZngfgrxBu50II8R4EUXZyKIDnmfn2FoQ5ZCWHSk3+2DrvJOs4QLivXRCWMAEYb83dCxHNXA8RYDXfeg0OCEEtgagP/SxEJPIeiGjjb0GUorzfWmOuD0XUW92aLmfmm4joKgjLPxRRPJ2ZF3X0zZVEFinMnWGp52oA70Z6GpEiAAR+mxi//s2Y6PFMlND+EUBKNR974hnDpTSt1QEADgz98qqjAy5YEHruq/pjPaw8wmsH/fCAptiGA8Au9cj6DbYDsydPWb6mKDol6RH8KsO2vXJzbGnVtE8dD+yJVqtGfj09bc+iVUpw/t4BCTvGfdfXGFzbkKwFY6YmX2JsdxQ1lCVudQ0Yvln/zHU+Lw9c7gzmGQ1TjufYfkRvBE33Idff4qIabUdt9ks2cjDBN9pxPP08f1V0gjtg7G2kYIF9gHsABseMC6qO2OgCraKxIuagV0vdTRXxNnNX1Ggc8A5FUWkyEqqqcXHjFzzW3KVURpXoZWqD5ihW9NhjNoryZZKTR7GpJCp19oDh07xqnM3FyXYP2+0OpcGh6A12U2FPKSPuMHuja5Wj7hTziLMfKoJxVFaTYPpr7RjmL8IE30HEGMe4zlZFDbZqjqttJE+FyWqNC34eCM3MgF13m2rQQIXb/Mq9rz3Z4Rx8Igqid3nSWnJN1+Hk9eDwsbkQDRMA0RQhCqLpwmQI4QVEUJUK4B0AX4KoxRyyeG+C1cTAqo38LIRgAsD3mPlEt6bOQkTRlhXthsh5/S4zb+3q+SRnL1KYO8NSz0SIwI9zChMwX/TErn8y3jPIIMpo/wiBZnDghT8ZB9yBU9fl1876xSa/M+HEerOv6o/VsAoWzE+9bmU/99ATbu9XHau2BlTvqFmz3yz6Qp1d/RTumWTbWbVGO96w4HXbo2tmq3sW/DE+btWnwei0R141vaXpV9Ye6j8tJdjwQcUgd39tfOJ5rs32gspiz27PsJHr6vdGDXP9HTcFK0tiNdeBCv8Ngf/SrdoHypZoP16KjTXS8hXtii84EO/NjC7qf35tefwwT8DI9xqBHCNWUWKHxIyvyoga6a7XDPdBraS8OuZgwJGaq3rjTXOXeyx2GWOpqCzZDJaROqs+R78guFlLtR80j7hruJAMch2z6cmFihbXkGHYMYoCjoFKg90wGtV6VSMfkhwxRpItTiWHm+sdMOpsQU2PKTbJc8TkmDLteFSiftTZn4uRopXVJerlNXEc3eBXx/sOGhP8B+BCCdXaq7nSWV/7q3t2fr2jnxcRhRoVqM12tbVu2915z+GVr1qr2+21tot6pcBaCIvTgMiPHQch3n6Iv6lqiHzfZGv/pxDBVhdAWM2z0LIwvwFgPTP/yXpvopm5pqsvjIheBzAGwn3+MjP/uqvnkpzdSGHuDEs9sRDup3OG5VHuzY8kJcT4FGVk+6NP5hev6KtGHsOC5ttNUgMrFjweBNGJ6F9f1WNlACcDQJpryM6FaV8Jle9DBdXlv2vfOCAquvLI5CnZae/QV7e+Q1+bb8upWqEWNS56UHt11a3qR3N3Oex5N6em0M3/4aI5e2OHbJ9419E6W2NUsOEj2xjP1Krh8TNTN9ryjh2JOpAyfMT60oY4Ne1v9N3je70jMrT9dUcHlR5OfED7V8VsbXPqvzyuirejopyj95J5xUYOxDemJxzLOL+sNGlifIBLYfi3V5JRnNrPndk4NGZSfYIjLf24Vu87oBZV1sfkc1TKPjITfOZu9xjajslUWJVuNpTalfSq4+aF/k00H9ugu44beW6vmm9qZmyhZvQ/qmiptSmmpowkr2uYUu+0G41qvaJzGXlU1Uiyx1OiI5l0h9OotRuoVr1qIKbIUD1H2RZzXKtyx+hHXf35qNZfK/GmGLW17n2bvvG1u5q//61BRFMhUm26QkebX7Qk5AwRhBWe+2vi5FKT4RyFWDMeAnGj7IaIZAZE/m4mRIGHtyHWZ/8O4N8Q7mqGsFZvsvbfBSHeLQlzGYAMqyayRHLG6E0uq97P0ppaLPVUoplb9mxkk9Ox576UJH+Vqk7ryvFXrTfXtiTKAFCeOH43iCY323yiuECJ99BYZq4iongASOSYIRlm4srCBiw8XDBpzbWD35xfyANWbBw/ZxErWPlo4Y0Lc8whm5/AkyNWFR5Tv3Vhasl/ptb7l776i/ja+KkNu0fe5tnn/6Ji7+En3ZMTLsDM4KWxG7YNLy10HrLdNvxFuJLKbf+aeAN9bl4Q/f1jIxpsebWNF5VujHpWe7PREVeS/tzXYo987jiuzNz9D+flG1+rj29ISD+WcV7V8dSL/CWKP6Goake9EXi/Plp1xg+JmVAzsHGRw1Zx2aDDavnRoFrcMMizXYlNfotsA2uxZ+QobYsy3Xy3/ktKXalDtZV5zRne3dpY9xZtypjdKHYfVne6C1AQ+NxIKlSVoYdJSa+OY0UdqTVGJ2Ofm+BVK5Qgl5FiVnKS3UPJjvGKx3Gh6XOo6iAtqJSpdRSMOsC2qPLjwNc687G1dNPZWu3mkMCGfrcmys17BId+hwt08xrNocpWoWYGCpqKeCgQUdChaOkRECIcOldM2O+R1viLIFoPGgCOMPNiALDSi6RlIul1SGHuPIdwFgtznk0ruDM1+fjRtlKf2mFoMR+4YYXZXHhPUNRvbu2pWykY+o5ksFobrNjjsSfNDe29IDhu2ivKyuKjR8fPS0o+vObu6D8sepDT1xweO3ghVFr5weE5C/ID6Xnv2R9yvlV0fN5fPbFrb74ndsxdH27duWDtzhG7x3zncHn8rfZtNcuxs2qFc1by5ZgVvDhmw67BvNN2RL1k8Cq6Mf1FbeWAC/HmgK/bltcvjvl477za+MoK7Qf+95T/qv/jvamIfepbntJdSrW6aOe79ss2ve2Pa4x2HOu/UC1Ov97wac7oPb49ak7Nm0GY1dTPPVSbFDMRKf4rUwPlZnyeevxAmnrcuCR2pysh5T2/K61C2Z85XNukzAw+HrhJqy13EZUGAqnlJbZF+jbb+dFbAmmTDmv7XUdoXVSJXuZdz6lHFWVMAczhFdEKaSNQF5NhFsYk0QFvgxbgcphGoRlNipLsSFRjbMMPd/KjC19yCLX/C/+OCO8chGaPW7OYw1sKhotxuEA37wNMaIqsDo0LdSHS0VR+Mh0ieGqgdZ7nIO5EQsePDjvWZ20fQcJTkwZhce+DcGW3xP8AfA9At7iyJZKOIl3ZnWWp53WIeqxnFaWqWnpvStK+nSL1qcs3bC4f177wuFFpM1uP7F0x/7EDpmo/qSqYr+rxQ4BxIuVqpGfGukkJ580JH7NLPbp+g23/bEXRG2fNfrMIKmfeied31FD8VG1/zSr1UP38ZFSXf+a4rySWvOMO2myHvt4vNTDoGJk//6dh87kG8vaJd/oCqHcH6t+tcilKxtzUaw7E2JPGr7fv33FQPTZywMBdBwcM3NVvvzLS/yK+W3XMyBinHq7P0Q7Vx00x92s/sb1+fBLtH/tJtKvg+ThP4LipDrtkKw5cstW0xzY6hxanz917rP98pdGRMMbUDx8y/NuqTb1woEt1u4bETDgwKHqsLVqLG12jNNbsV4sPFyglGnmOOpJSDtXHJJTY8hyDtY3K7MZd5jhHTVW0htJgg1beaJsS2Ge7iLZ4Fyo7FJ+jyrbdBX2N26U31GnawKPE4w9BH1DutLM2jOo8o4JVnqFkkH7vd179zhZ0ECLaB2GBFkI0mm/ucg7VZw4X45A1HBJdA0JkQzm14YJtQpSMzMTJIv0vCLf1TWHXMiGipd+DCAoMQEQ3B61zb4cI5joE4DKINeVnIVqzPg1RN7kQQsy3MPOXiOgAhCBXQQj1D5l5uZXn21rw1/MQAm5ABH+tb/+dlEhODynMnWWp5y6I2rRnBfVEdT9LTtz6P7drWviab1f589P6htSaVi0QeB0Jxetn/yK9+XZf1RMHAP2EWNsVZ/XVA++KsSyVE7zqWLXVR8EpUVGVeZOnZKf5yGXegReK/OQcqR6sXaPl1c1xIhD4t/0nW4coxXMCgP/W9JQNOzXHrAfeNjdMzOe5+UOuWn9kwEUT9MCefXrjp6keW6IxL/XLZXZb9Jh1tn1bDyrF49L6HTg4ePDW6FotJukl3Jq7FdMmoDpYYttbU+6sbRizRP10323ah04H1Q19LS4m5/XYmKignwZdtpn3XLidXdFe24iS1Bm5hf0XBhui+o0zzcoqw7ftsBHc7yH2j0p1Ze4fGjOpKtWVmaKSNqJUqT2wXy0qOaqWR9k9hfbk1ENVnvgi5xH7AMdGZU7tdkyxVdTHRXGpXquWejmpoSJmIe8IXKJu8o5XDrqPOn3aWrezbr3LqaBKtQ07jMCSz/ji0Xtzfc3f69YgoodxciEKE0KMw9OQWnNtt+RyBk4W4J9AWKdXWdu3QeTl6tZPyEr2QVjZDRApQv0grN4aiECvDIh15TEQa8pjIboKXW7NNXTu2RCVtZ6BcG37IET+ZWa+vf13RCKJDFKYO8tSzxQAHbZCeisBIPD7hPgN/4yNHstEid1xzts+MlZesIMXtjUmP/PyNQWZl85rvt1X9ee9QHBU+LarB96106G6JoRvCwWCgWDLGJCzdvDg7XMrkVByN57VTVL7q/l1a7UDtbMIrDxr+9PKL6mbFgHAmzHRG36RGD96wiE+8uN/mTGm5nFvnXT3wUZX0jS98X/rjcCuKanOQYdnp1xlkGobsta2b2uecnxCYtKRw8OGf2Gy3Rz9Hq7b/G9c0S+oa0nawdrtamFDxmAutmdp/8y7UNkyotRG9GycZ99HUe7+zkaKu2KjmXveDva4/eqo8qRJu44OOL+xNmbgKGa/zQjs3mP4c8Bm1VinGhUYHD1+/6DosRRrSxxpEkcfVcpz96vFNcVKRYLbU4yUtPzK+Pgid7E9zf0Fza7cgulqSSA10SzXa9USX6NW7Ysdrx+0X6xuqTxP2U4xamX5wIcLr+noZ0dEyRBrtiqEAMbiZIu5ueB2hFCz+pCQ10JERc+AEN2/QwRnGQD2Q1jpMRCiuhvCTe2EsIgDEOIbC1F7eiqA/cy8kIh8AP4J0axhLzP/pdlrOwTgambeYVnEi5j5pk68DonkjCKFubMs9ag4uQl4n4IB/psnZv2f4+MG6EQDuuu8Uw+Y23/0ljmeTk21OYn1M5du8LqST7GofdVP7gIHxoVvm5506YohMRMWNR/7sW37ykK1YiEATJ6yfE10dNW8AgzO+yl+lwQij1pQt07bVzuDAO376vtrH9DemE4E+1FNK/xqv7SqgElDf/qGsXnUUcwvSZ2+JXfkN9NMeB2B+nf3sVE2NzN63OapiRfHmQqlrbXt3ZKnlEyK9ZQWjxi5rtrprJuxgeZufxU3cTXipyplvh3avtpGpTEw5Spl/a57tbf0QVQyZafTfujJ+LjjG52O0fF1MK/cYO5bsIsT3X4aXZEwZvfRARdUVXuGDTWJ0sxgfo7h31Zr6scyAXNAinPg3qExk0rT3IOTbOQYEyC9Ll8t2XtQPe6vUGrSo+OK/Smp+RXx8UXRFbZ4z0aaXbIJs7jQzEgxqjmgHPdWKHXBlUd+cvHDHf38iOgKCJeyA025wAwhpjEQf/NxaPp8wy1hHUJE3Ti5/aAB4Xp2WmMM6zxpEClPn0BYz/XW+cogxPmPAG4BsA6iUMdYa/w/rPMNgLC8x1jn8wJ4FUKcHwJwITM3ElECM1cSUXnY2I8AHJPCLOnNnHPCHL6e1OWTLPV8AhHp2af4KMq95eGkhOiupD61RUItlzz9tKEojOS2xpmk6CsWPNEA0Zf0JHzVT+8E+06yjuPtqQcv7n/TsOZjg9AbXnGsrGVCuqLo3lmz3yxUVWP4Fkzb/kdkjQGRXT1Sv17LrZlGgO08ZduOv9p+P0AhTtAB/a7U5LWrXc4FM/bz9nvfM5MBe0LO2Fs2VSaMmWvqx/YHGt4zwIGxYzyz14+Nn5epkxmz1rZ3W55SMtEdVV09YuTao9HRlTOPUObRv+K2Y3kYPh0Bs962r2a3ctw7PJFrnPdo7+z6qrqin42CQ/4T5d72fJzHn2fTJqdWo/KadWbenFxOcQYxutozNPfwgAtLKxNGD2TFNtjUy/IN/7YjRvBgPNg3zq44azOjx+UOjh7PHnvScCIlpY68RQeU4/n5aolSq9QO9MQfr0xJza+KizseU2dzJ2+mWYX5GPrbt86/572OfoZE9C+InrxAU+CXH8AXEMLY3KvS3KUdqg8dWncOCXceRHCWCiHyr0PUi260xtwIIbihADGCSNkaCeF2rrD2OSCCsQ5DCHM2gB9BiPkkAK9bFa+yIKpjBQB8xMwPEtH3wsZ+ASBGCrOkNyOFuSss9fwcohdqn2CzSH3yVapqR+vsdhjFZP2Fx4090T5MaG9sRcKYnB0T7hjf0j5f9TNbwd5T5veVzPsLFVJPKWqyWz26Yb1t/ywACK03EyHqI1yx7jUsmQ0iUgsbvtB2V08mwD6Eig7/255lOkgfDAAfRbk3ZyUnDnL64Xj4dWPnkBLMq40ZeGDbxLv8uuoca/g3rde9awcrUBImJ164YWjMxAlBMtQ1tr3b8pWSiXZHg2/EyPX74uKKp9ZTTPA1LNm5FgtGmFBS1GONW7SDtQr85pTZyu7cLO2flRMpb2KjQsrrsTE7XouNcVaoyuSMchy5Zp15eMZ+7ufQMbwuOiPvyIALC8uSJqSaqmMUm42VRmBXruHfpbBZPRZATKKj3/6hMZOO93MPi7MrzrFEpJVR7cEDavGxw2qZu5Eah8QnFBempR/40le/svJ4Rz9HIvKiaY03D6IpfCgCWkdTYJcDJ7uowy3n8MehcxCEWAesc/0OItJ5D0RTCIYQ7dA57RC9hRsg8o5fhgjk2gkgh5mndvQ1SSR9lV4hzET0JQCPQvyDljPzBUQ0AyLIygnhqrqZmfdZa0Sh/qNDAbzLzD+yzvMMgOkQASBvMfPDYef/E8Rd+hoAQ6wIzBav0e6El3pmQfRP7dXk27TDd6UmFx3WtFmhpM3u5uevGyvHH257XTnEznHfXVGeNHFRS/t81c9tBjeckjN9fvo3ViU7M1rMhw4FggFAaL0ZAP6C761YQRcuAgClqHGTLadqAgGOWNTXfO64Lz+R6iYDognHV/qnFVWp6uSFOeam72WbA4kpOW/IVWuPDLhwAiOoBRv+vdkM5s2yKQ7fzOTLt/VzDZ0RID241rZve75SMkmz+XnosI3bk5MLxhukxn6MxZvexVfifOQeQw36UW1vdZ5S7h/nht/9HfWjrbdoH8XEUcPE46p6/Nk4z77saHe6T1FGDD7OB7+81iyckseDbAYGN7qSjx4ZcEF+afLUBF1zjWOYuhnMy9H92+tZLxoMmANsZK8dGD0md3DMhEC8PXWoQko/E6Z+TKn8ZPaj1yzuyGcCAES0DMADaFo/zoP43/KhqXUhINagQ4F7QQihZQhXNFnP6yCs63oIEbdb45dDRFkfs46xW+ddCuC7EK7mPIiI7UcB/AqiWlcdRAR2MoBMZu7f0dclkfRVIi7MVtDJVgALmPlQ2LpQLIBGZtaJ6EKIVIVrLWF+CKL2rR8iD3EeMx8NO1aFcHvdBRFUcgCif+pBAG8AcFvC3OI12p20WGcuQ9MXVq+iTFXKfpiSnLtdpD7Zeuo6l2w213/nU3N2R8evnPeHvYbmHNXSPl/NXzbCrJvRfPugqDGbZ6Vc0WKRk0qqP/SO/Yv+IPHlP3ly9promMp5APAIfrlqP41eAABKceMW286qMQS4NOjBd+wPb5igHJoPiHKjP0lOXPVRlHt+tBe1v3jVyO1fgTk+e1zJtkl353vdKbNNo+posP7tY2zWznKpMcfnpl5zIMGeNidAev1a295t+UrpZEXVbZmZ2zan99s3RFE4Ywcm5byMW+pLkDYDJnT1SP1mLb8uhnSeMIKOHsrS/nF4obJjjEqckmO3738y3lO8weUcaRKljSjkvV9eZx6fcIiHaSYyfPa4ksKMRfuL02ZGBW0xE0CkmXrJQd2/rdAM5iWC/WMBKHH21LyhMZMKEx3pn49/7LpHOvq5AAARhb4IDkC4nKdAWLAbIFKQgtZ+E0Jw34NosmBAiGcNxNqxBiHSuRDCno6mmtbrIDorlVrnSIGo4hUPIep3Q3R6ehoi2vp31nySAXwM0eUpk4guBvCIdY48iBvqeusG40oIC/8TZr6/M++BRNJb6A3CfAWA65n5G822DwDwBESpPQZgY+ZRljDPZeZbrXH/BvArZl5DRLdD3H1rEF8Id0JEgT7BzAus8VdCFI+/vLVrdGjiSz1vAvjKab34bqaeqO6h5MStn7pdU0EU3ZPXGlDKh37/VyOJOhgE57fFlK2d8+uk1ix3f81fN7BZc0pQmEKq77pB95nUSher/9i2rzxqBYKFrzebIPNePL2pnFJmAoBS4t1m2145gkRTA/xGe37lV9UVC4iE63WVy7njztTkFJMo/ZLN5vqbPzVHKEBiceqMTXtH3pjOipphBPZvDTZ8HAPowz225Px5qV8ui7bFzfQjWLPGtnf7IaV0EsiMyhiw+4uBA3NSVdUYVoLUwhdxW94uTJgEIg/VBA7YcmuKqSYwWYPhulZdtfUu7V30R/kUJij/dbu2PxvvaTxgs00CUfS4AnP3l9dx+egjPEJlpAe1qKrC/vP3FKXPtfkd8RNA5GSzodzw5+w1Ars1NmvGAvjKfW8s/0+HPkiLMGGugRBJB8SN71YIYf4AwAsQjR+8EP9X060xBoQHa7Y1ZgyaWjEColOSF00dl8oh/m5C7RfHW+N/ByHOyyCE+TmIDIjzw8ZOtuZwKTM3ENGPrbk+BSH8o5iZiSiOmas78x5IJL2F3izMLwHYysxPEFEmgBXW3fJNsAoAWOOWA/g9RFDIpxDtzaqs41dAuMFaE+YWr9GhiS/1fAfiSyjiBIHgHxPi1r8WGzOahQeiR3EEuOGvfzKO240TX7TtUjDw4rX5Q66a29p+f83f1rFZNaelfZcPuH1jlOY5xZoGTgSC1TChHwBERVXlT56yPJUIUX7YvXfghTwvRY0DAKXMt8O2tWIoWV2sblD/u+FX2osTiET7wCpFqfxq/7SDxzVthqeeyx592chPrsVMQ7E35oy7dWNl/Oh5DCbdu2qt4d86HkB8qnPQrtkpVxkO1TXRj2DtGtvebUKgOTY1NW/TkKGbXZoWHO+Fs/5f+PqW/+JLmQZpg6Cb9Vpe3Vb1SEMamTwiFZWlP9T+tecade0gO+mDvUSN/4iN3vb32FhnuapMAqBMzuOd16wza0YUYbTCSNZVR31x2uycwv4L4HWljAdRNLNRofu+SL/n5Z8FW3q/WiNMmPdCFBlRINzRuyCsZw1N9awPAfgOgM8h0prqIKKkGyCWi5IgloziIBpK1FrHKdbYSoiiHWQdnwFhNedC3FA/DlGI5HcA9jDzfCL6L0QQ2q0AXoIoHgIIl/h6ALdBiPgWCLf5cmbucFctiaQ30RuEuTVX9rsAXmXmt4loKYCb2hHmKgCvQNxRJ0MEi/wYIoViP4DzmDmPiP4BEZV5eWvX6NDEl3oyIL48emTttiMwwK/Exqz/U0Jchk40sP0juofHntfX9a9AiyLaGhum/2xdY1R6q8f4a19Zw0b5KfnNADA+fsHqMXGz57d27G716Pr1tv0nXOrh6821iK34AZ6vN8g2CACUcl+ObUvFIBL5sJhOe3P/af9FvEqcFjr+V4nxK/8ZEz0bRPZr1plrr19pjiPAUxOTuW/7xB/ohuYay6a3KtDwfg7rRXMBqJnRYzdNTbwkTlNsw/0I1qy25W4vUMomgeBJSCjcMWz4hqDD4Z1mgsyVOH/zG7jRXkexk0Jz0vbW1FKDPo0AxyJl+84faf+sHU1HJhMhqlRVS5+Pi839IDoq1asooxSTjRn7eedV6836IccxjoB4kzT/8dRpO0tSZ6y94Y3v3duZz8bKAw5FRfvDHs8C8B+IGxkTYn04E8J6NSA6NPkgoqj7Wz+K9cNoSpXKh/g/6Qch3ioAD4RIh6qD2SAKgXzbOl8/CKG2Wf+rqyFc5b8FcD4zn1J9j4gcEB2jroNYjz6/M++DRNJbiLgwAwARXQoR8KEAKGXmi4hoNkREZgNEasSNbQkzM6+wLOA5EOtWNQA+YOaXmgV/rQYw1Ppnb/EaHZ74Us8KAB0KfOpu/hPl3vrzpASXV1FGtz+6+1jyqbFq8WZuMRirNRhkfr7wiSqQ0mohE3/tq2vYKG1RmN1qTPEVA79/SrWwcF5zrN7ipcCJiN1Jk7NXx8RUzgeAY+h/5Mf4k5tJSQIAqvTvsW8q709CHNAfZcWfOn5U6yb/iTSyzU7HnlvTUqJ0okFJNVz8q5eNovgGTGWQeXDoNWuOZpw/CUSxpl5yIFD/Tj3YOxmAGUqxUkjpbwn0tgKlbAoIsTExZftGjFxX4XLVziSCegAj9r2I28qPYNB0ENnhNyq0A7U5alHjEGIMjIK37nvaB9uXqJ8kxJB3LADssdsOPhkfV7hWrEenqwYH5+7h7Vd8YfoHlmECAd8dvTf3jY5+NkSUDiG4oRvMSgh3/xcQlrIDTXnKsRAW6hEIwU2CyH2+GiJ+IxHC4tUhshaWWuf9AuL/7i4Av4RYAhpnXedSiBSqwxAeqF8DSIVYK74KQrAfhcg//i6Elb4FQpwPWnWv+0MEirmZuZREOl4+M3dL4RyJ5EzTK4S5z7LUcyNE9aIzxlaHPffe1GRvT6Q+tcf4Q+aun/3THEniy7LDVHmG79k2+Z4xbY3x1/5jFRvFrQr+tYPu3acp9lbzr5sHgoWvNwPAbozb/SiWDoa1Vk1V/lz7xvI0sgL4ouCt/8Txoz39qeKEy7yOqPaGfmm7Cuy2OQDwjc+N1Vdu4MkERFvBYYe87pRZAKD7d3yhN37eDzAHKFD9kxMv2DA0ZtJ4IkrwIVi9xpa7o0ApmwxCrMtVc3jEyHVHYmLKZxDBUYW4sldwy55NmDmGSUkGMyvF3i22A7UmfMZUAtSxdOjgg9rrx2Yre8YpxIkmYH7mdu14Ns7TsM9umwiiGJvOldevNAf86JU9jR39bIjoaghxDeUkByBukPtBuLXjIaxjP8SNrRfCle2CqL41G8KVbEB4rG62xnwI4FrrfPVoSq16BsBPrWuFGlwE0OTWHg7h7RoKYTEPtM5XDBFLsoKIzgfwGzRZ9j8DsAnA+xA3DARxs/5yR98HiaQ3IYX5dFjqcUJ8YcT19KUO2bTDd6UkFxXYei71qS08DVz+7J+NoMpo03JtiV2jb15ZmjqtTc+Cv+7NVawXtirMc1OuWZkRNaLNc4QHggGA2111aMrU5clEYk35c1z4xQu4fTqIFACg6sB++xdlCSQsPxBM81Xbr1fPVXefdJ0n4j2r/+KJnQYiV3oFH/nlK0ZVjA8TAaA4deamvSO/kc6KmsGs+4KNn35hBnKnAYiyKY6amcmLt/dzDZtORG4fgtWrbbk7DlsCbbc3lg4fsT43Pr5oMhFig9D8H+DLm5bj6pQAOUYAAHn1Im1vzX6l1DeGgBQb9MDX1f9tuUN735aC6ilEUHxE3jdjord9GB218V/f3ddhNzYRfQWiylYoT/wvAIYBmMPMTiIKQBQDuQViWeghiKjq7RCW9XkQQVppEOu6Xoi1ZxtEo5eXIZaYnrW2hQIzoyGEPlQH2wthMUdDiP9YCIv5AWteTgAPM3N2R1+bRNKXkcJ8uiz1PAnx5dUjlKtK2Q9TknK3ORw9mvrUFsRsPv+Esd3TiC5Z6avm/W6XrrnHtTUmUPf2SlM/3KrwpjoH7VqUfn2b5wjCaHzFsaI6FAgGABkZu9YOHrLtRNDZa/jWqo/oqhM3AFQbOGhfX+YhNFUty9JeX3WbunwOUVNlq912+4FvpacqAYWGErP57f+Yqy/exjMJcBqKvSFn3Hc3V8aPmgsijc2644G6d/LYrJgDgMJTrIhI9SFQtdqWu/OwUj4FhBhVDdQMHbZpe0pK/hgiMY9NmLntFXw7WInE6SAimBxUjzZs1vLqXBQ0JwFABpUVPaD988BlysYhNjIGALgUS2s+bus9CoeIPgawAE1NKlZDuKKHQgjlQADHISzdNAhLmiAs5t0ALoaweo9aY4ZZY0oB5ABYBLGkVAHRKjUBwqq+EU3r1QSxTp1njW1g5ouJaAhEyc69EGL/KYC7mHlFR1+fRNJXkcJ8uiz1TISwILqVBqL6h5ITt3xyBlKf2uOBt4wV0w/woq4cG9Tc1avn/jYGzbpENSdQ/95KM5jflkVsfjXzR5VElNTWecIrgoWYNDl7TYyV3wwAv8VPV+ygKYtCz6kueMi+rtRFQnwAAJcr67f82fbnYUQ4UT7US9R4U3rKlj0Ox3wAGFjK+b/4u+FzBTAGAGpiB+/bPuEO3dBcYwHACB7OCdZ/oALBMQDgsSUdmpd6bWm0LW4mAFgCveOwUj4VhBhSdF/moB0b+/XPHawoPAAACpFR8FfcfmQ/Rk0Ndf+i2kCebW9NIVUFJol1cuYrlfX/fcL+5KVYWmO09f6ceM1ED0GUqQx1FCuEWNv1Q1i3nwJYDGHB6hDu5ncgRJUh1nkJwHxrfxFE6uGvIYTYD2GJ10OsMW8D8FXrfKMgBDwIEQDmgbDE/wygjpkvtbIkPgew24oHGQjg3wC+zcxfdOQ1SiR9FSnM3cFSz2aI9bbTJggEH0uIW//qGUp9ao9FO8yN3/vInE5djD4/2n/R+gPDv9JuEZJA/YcrzOCBRW2NuaT/zWvj7CmtplyFaB4I1ny9mQH+ER5fX0QZJ6LEqT542L6u1EbcZG2PoYK89+0/t1vW6Aleio1Z94eEuPEgilFMNu740Fwzbw/PIcAmgsO+vPpoxnmTQRTLzGz4NqzVfRtGAJwCCOs/lGIFCIFeZcvdecSyoAHT6J+R+8WgQTuSVNUYAQANiKp5Hd/avgrnDTNJFdWvDLNRy6/foh6uTyKD3ypYtvih9t6bcIhoBUSwpA2isMf1EJZyLMSa8QwI9/Mz1nYTYg24FsBbAO6DWNsdACHEz0CsKw8DsBJChC+EcGl7IPKbH4dwmW+DcF0HAbwLUbBnCkSa01uWMC9n5nFEpDGz3pnXJpH0ZaQwdwdLPbdDfCl1GQb477ExGx5LiOunEw3qppmdFukVfORPzxueUPRyV9g4NWtNfcyAFqOtwwk0/HulGchtcw15eOyU9VMSL2pX5JsHggGnrjfr0AJ34C976q2UJQCgBv2ofW0JEZ9Yc0Uiaso/d9xXHEuNJ9X4zrdph7/eL62x0YqKH3aM9z38ukEOHSMAwOeIL9466e7DPquTFrO/LlifvcXUC+bAKlMZnmIFAF4EKlfbcnOOCAs6GgBSUvI2DRm62WGzBSYAgAFF/xRf2vQ2ro9upKjQnAxq0AcVXz7tWHvvzYnXKjwYxyCqbzFEwNUYCIH9HMBGCLHOh3Bt62hKZ3oaIhI7EWL9N1T85QWIVKXQWvFhiHzlxyB6MSsQ7mo3RHDYYmsOoYAtHcBDzPwyEW2AEPgCiCYXKyDWw6MhCpTcxMzFHX29EklfQgpzd7DUEwsRBNZidar2+NTt2vqz5ERX4xlOfWoLm86+v/7JOOwM4rQ6UX228M/HQUpae+OCDZ+sMAK7FrU5J8VRc83Au93UgbX2T2w7VhxRy086X/+M3WuHDNl6wuJuQFTNHXihLEj2Ex2sqFE/Zl9TYhDjRF64AwHfR/afbB2qFJ+Uhx0AArenpazf5HIuBADN4MC975rrpx3geaH2l0VpszbuG3FDf1aElWsaFQWBunfKwHXTrdOclGIFCIFeZduTc1SpOCHQ8fHHdg4fvsFndzROD1Ur241xu/+G79YcR/qx4vOnfLW99yQcIpoK4a52MrObiC6HEL4aiDXkjRA5w3cDyLK2rwfwNYhynKG/9ZkQAVw+iLKZjRAphB9CuLkZQnwvscbHQVT2+rq13YRwp18L4BoAscx8j2XN72Hm71uf90oAVzFzGRF9DcAlzPztzrxmiaSvIIW5u1jqeQnAks4cst1h33tPSnJjhXbmU5/a4zcv6msGl6BdS7ctamIy92+Z+sCIjowNNv5vleHf0W5+9FUD79zmVN2T2z0fjMZXHCurmbhf+PZJkz9aHRNTcaJYSSlSjv0QT2lMSuqJQV692LG6xE+MzKYjmZ+2Pb7yMnXjoubXeic6auPSpIThTBQPAGMPm7sffMN02wwMBgBDsTfsHHfb5qr4kfNCa+1GYO/mYMN/EgBjCAA0T7ECTgj0zqNKxbSQQEdHlx8YMXJdmdtdMyMUnGZAmXfx+QfWtveehENEf4VIbSIAr0F0cnoOwCAIYY6GyA/+FoQl3GBts0GsGz8PYT3rsKLaIaKrt0GkUOkQNye7INKaQjd4hRAFhc5Hkyv7eYi8Zi9EpPfb1rUfhhD5r0L0h66yjlcBFDPzxZ15zRJJX0EKc3ex1DMbolZvuxzWtKN3piYfPWTTZkci9ak9vrbSWH3tOm610lZHyR1548ri9NkdKsASbFy5yvBvaVeYpyZesnJY7KQOnXOPWrhhnW3fSYFgpOi+2bPfPBJauwWAAxixbyke7QeiprrfPqPEsfp4A5kYEn78beqHa7O0f0wjOpFDCwA4pqlFX+2XVl6rqhMAwB5kb9a/zI1jD/OC0Pp8dezgvTsm/MA0NOcYAGA2dd37+VrDv2MSrOWC5ilWAOBFoGKVbc+ucAva6awtHDFyXX5sbDkuvOBgp4vcWOL/PkSa0wMQOcM1EJHUeRD5+XdCpDfVA7gfQqATIcT0dYiIbh9ECU+CKJf5METQVzKE1TzJOu5uCDf5AQhxT4QQ9GMQa9YDAFwGEQDmh3Bv3wrhSu8PId4HAbzJzB929vVKJH0Jpf0hkg6xtGY9REerVqlQlPKb0lJWXZ6RnnrIbpvTG0V51FHO/fI6brEudWcpTxzf8bVpUjv0Xhys3dLh0qNjjIxZLrZvCd/Gpubcvu1SGzPqQ9uGY//IH+Cx/QgPMHKqqf4FaTGsnGieAAB4zrhi7pLgj/eZTBXh2/vrRr9VR46NPa+hcQWYzYCNXP93g7rwt9cpO3QFRwEgrvbQqAVr7h+VUfj5KjDXESmazX3BQofntiCpaasBmEHT71lT8s7CD48+U1vhL17NzIYL9sRLgpMWfsM/359hJK4Eo8Hni83YueNLC9asvuGPHX0/mnEzRCOJb0B8DwwI61H+DDP/HkJAC5h5JMRSTSmagrougRBQN8SaeSmEBVwDEeyVDhE8lgsRza0AUJh5IoSovwlhIVdBWOobAVxknX87mnpDnwdhzU8B8CUAY4nIRkRju/i6JZJejxTm7uXnLW1sJGp4IDlx5aKB/R1bXM4FILK3NC7SRHu5+qHXjRjCydZgV9BVR33QFtXhL0+C1iFhrgmWDzbYONzR814amJwAxknNDBob4wcfOjRlR/i22Vg79Vq8seGkgx1qsn9BWgIrdFKP7lXmxAkXBH7X4GdbXvh2FVCfKC1f9IfS8u0KcykAbBmuTPr2vWr8gXSsFq+TlREH31owZ8PP653e8i8AgJSoJEfsDfPtMdcfADl3AIDXqEv7b9Er8/9z7MUj9cGqDQDggj3xS0KgvRlGwkpibASUDzr6XoQgogYIy3YkgMFi6lCJKN967LeiohMBTCSirQAmhJ2iytoXBSHMOkRU9S7r+CUA1kK0jDSta/msazRCFCs5H8LKXgIRqT0TIrNhCsR682BrzNPW85kQNwT3QAh3p2q1SyR9CenK7m6WerIhXHLQAf1PCXHr/h4bM8okSmnnyMjCzM88aWxOrMf09ge3T1H6nI17R36jw5a37tu8Tveu6tCX7Xlp169McQ3qsPv2E9uOlUfU8lPGN19vBoA/494VG2jeopMGBowqx6qS42TwScF5saiv+cxxf14S1Z4SI1CmKmVf7Zd+pFxTT6Rtzd1tbv7Bh2b/8OppRWmzN+4d+fUMkHpiLVz3bV2ve1cOBLh/aFuKc+DuOSlX66EUKwAwwdcNXLbg7Y6+DyGsTlKHIKKel0M0fvg+RPOITRDBXI0QlnAOgG9CNIrZB5HrPQRCjP8HETH9OERVsIcghPRyCOv4aquIyUQI61yD6Oz2Comb00pmjiYir3WuqyGE/lGIwiI/hBD/TAjB3wDgLWZe2tnXLJH0JaTF3P08BIBfjY1ePyNzQOHLntgFvV6UAdz1gbmqu0QZAIrSZvs7d0THXNkAcLBuW4d6QIc4LzhuOjGdkkq0Y8fF0w1D3R++7U48tiiT81afNNCuxvsXpvVjjXaHb65FtGem/6kJO8whJ48HkGyYyZ8dPTblyrr6lSEX+dqxyrRb7lbdR5JwIlCr3/H1MxaseSA2vmrfSjAbAKA5p8x2xP0gQbGNWAHh7kWp78jY9448MfGLsuWbdDN4AMA2BfROZ94HIvrICvpiiBrYZRBBVQchak8XQYjnRIiuUi9CCPFnENbsl635hMT5FmvfOIiArckQRUvqAHzJ6hyXaZ3TBWE1v0BE2yCCzE6ZIoQoX2+dJx3C7b3Lms+mzrxeiaSvIi3mHuDCv45+tkTTbov0PDrK7Fxzyz3vmZOpG2/UPl/wRCErakb7IwW6P2ej3vhphyxsBUrgusz7A9SJimgtBYIBgNtdfWjK1A9P5DcDIlf4Ljy3vZoSpp00OGjWOlYdLyCdJzQ/z6PaCyu/rn42n+jU93Cty5lzR2pygkF0wgK+cKu54ZZPzKEKN5UCrY4dkrtjwh0wNOcJy9w0ao4F69853KxXtTkkesJF1/z10c86+vpDWEFfRyCCzf4HsQacB+AHAKZB5A0vgigg8gmESF4OIcAvQqwlfwOiJOdmiHXl3RA5z2nMrFlu8A0QYn8DgFuZeTsRDYdYb/4LRGDZbcz8GRHVW5bzTRDdpm5k5iARFQBYxMwFnX2dEklfRlrMPUCJpv0eOHlds7eSUs3H7n7PzOxOUa6P6neoM6IMAAStw9c3Ydob9Jrd7Y9swgoE29x8e2Nj3CnrzSpM7fe4c5SDvbknDbYpsf6FaUPYpmxvfp4H9VsW/kS/ZRMzGprvm+v1jV955FhUelA/UUryv1OUWbfdqdLxOJxY146rzR+9YM39IzIKV6wCcx0AKKqnv8Nz8xxb9NU7AC201v2/LopyAUTQlwsi/WkmLOFEU2U3BcJK7QdR5QsQ+c4qgCsAvArh4p4L4f6+DqKU5yFrTIgqiPVgAnAfEeVARIEPZeYnrMfNb3A8EG1fg0R0Hlq2qiWSsx4pzD1AzpKcgwCeivQ82kMzOPDbvxrVigjk6TaO9Zt3tNMHkdpmLe3mFNTvCnb2EpcFJic1DwQDgGOFY+fW1Sae5I52wRf9B9yZqLBReNJgTYn2L0wdwXZla/Pz/NM4f+a1gaVHDVZOqUjlMc24TwqLZn6jpnYlmP0AUBNFSXd9T5v19/OUtQxUAwCB1REH/7Vg9oaH6p3eihNCrtqGTHTE3TlcdUxfCVEKsytoEA1X/NbjTyGqfHkhAv4U6/fjEPnIYyEis1+FWFP2QKQuBSFSA+eiKd/YDZx0U2JAWOPHAZRAuMdfBeAiou0Q7u9Xms3vNQDTLBH/FsQ6s0RyziGFuef4P4hi/r2Wh18zNrgD6Pa0k7KkSVHtj2pOxy1mAMir2z6SO7kOE8/RmQPNpPUt7dux8+LphqGeFH0dj6qUX+JHfjBXnzRYVdz+BWmj2a6cYoFv5RGj5vv/hEZ2tCgqWZXVC/9eXHLIFuae/XCWMvf7d6i+iuimNVSXvzJ9zhcPzRy57/WNYKMYAIhIsbnn77rvjeU5nXjZ4RCa2ioegbCY34MI4KqHyEs+BhEU5oWoc32Umb8DkcpUAxHE9X3r2Hch1qtrAKxn5uhm1xoOUZazmJlNiJQrMPMkZv4SM1daz6Ot3+XMPJuZxzPzzcw8WrqxJeciUph7iJwlOdUAHoz0PFrjqvXm2pHH0G5Bj85iKDZfwB7bebHvpMXsMxqSdQ7ktj/yZFoLBBP5zZfZmVEXvn0QCobej0cPh6zcE6jk8i9IG88O5ZSApCIkpU/zPzPgGCdubGkOk/yBUasPFyYNDQRPBIFVxFLa9+7Upr89h9YwmubQv3jtjAVrHoiJq9q/CqI29M8683qJSCWil4hoF0TRjwCENZwJkdI0AKJE5hbr9wAIUbUB+AOAwVaK02sQqU9fQKwRx0AEZzVaY0FENxLRRohc5FEAngTwJwC/JaISiDVnk4iaqqxJJJJTkMLcg+QsyXkeIpq0VzGkmA/csMJst6xlVyhLmrgbRM72R54MoXPCDADFjfmlnT3GBtU9Rx9R2NK+xsa4wYfyp55ijU7G1ok34qUtaG6hq+TwL0ibaDrVU9oQNsIZNc//+LTVxriVLV0rijn6vWPFc79fVb0GzI2h7W8sVOfddbtaU+vCttA2zfBHT9nx+IJZXyy9545nz6/u+KsFICpv9WfmcRBR19cBeAnC1XwTmspcahBpU40QgV+HIVzQ+yBEVocQ9J9AWMg3QLibPRAu7Kcg6mjPZeZBEEVDKpj5AMT3zC3MnAIh9rd28jVIJOcUUph7nu/AWj/sDbh8XPuLvxsadbHhRnsUpc+tb39UC5CqdfaQg7Vbu2R5jTYyZrpbCAQDgGPHxsypbbbeDACXYvmc8/DfVaccoJA9MD91qulWT3GRMxTlm8EHFz6lX7maGS22Lfxede28fxUdL3aY5okKYyXxlHHL3eqkj6bRKrbSpQD8e+r21W929DWGMRjAAiIqg7BwQ9a4CWANhJVcBBFoNR8isOspiPrUoRrV+yECvFQId/dOCAv6LQiBB4SoTwWwyVpDvgA4Uc40AJEvDQjLPLMLr0MiOWeQwtzD5CzJOQaRGtIr+O3fjD2h5go9QY1nSIdLZp6M1mmLucxfOIrZ7LTVDACXBqYkg9FirvXOFtabAeAWPLtwFO8+1QJWSAvMS51hRmktNpL4nX79/DuCd+9kRk1L+0cFgkPXHikcMN7nbxJ+InrpInXBfbeox2td2ADRF7nDEFG9lUf8GEQ1rdsB/BfCnVwNscb8bwiLeBiEwM4DoFtlMxsgbgoGQdzEbYMQ4v7WOW6HKJVpQHSfIgAvW+vHk5h5ZFghkGBYPIABYZ1LJJJWkMJ8BshZkvMqRP5mRLntI2NlajVOyeXtLhpdyUdZ0bom+l2wmAFQVaB0f/vDTiWeowYNaiUQzFpvdjRfbwaAn+Lh+clcsuGUg4jUwNyU2Wa0tqalc35kzpxyWeDX5UFWj7S038Fwvl5csuDHFVXrwXxCwAuTafAt92jPjt6b26L7vR1mQawJH2XmtyFKYYaqlL0H0XoxFyI3uQGiYl3IAt4EoISZC63AraMQ0dz/gGh68XMIV7YdwtX9PwDXkVVMh4gSqJf0FZdI+hpSmM8ct0F8AUaEqQfM7efv4NNq49geRelzC7p+dJeEGfl1O7psfS0KjptBTK2tN2e2tN6sgJXf4J6Jbm44NTKaSAnMSZljxtpOcYUDQC4PGjrL/6S7ht2tRlXfWFs3e3lhcW2Uae6xNr2VsyTn5Y69olP4DoCLARRaKUivQvzPfwmicEgshPU8CCJSOx5N+cxxADKJyEtEBkRt6nEQru1rIUplHoVYb3Yy8x6IwLRPiGgnRCrWidKjEomk40hhPkPkLMkpRyfdkd1FQi2XPPC22Y9OLgDR7ZSkTOly8wsi1daV4w7X7x7HzF0q5mIFgp0SoR1CrDcnnSKyDgRcf8AP+mkcLDjlICIlMCt5numxnboeDaACnqTp/mdGHDD7tdo/eZCuD1h9uHD4vEbv++j630wUgI8hhPMFiEjp8wFUQvwdPM7McRCWbxWEe/peAA4i6gfR5vETCPf2bgAfWec1IMT85xBr1IUQAWNg5jcsN/YEZp4KYBQRPRmeRsXMbzHzTZ19MUS0lIju7+xxEklfRArzGSRnSc77EC3xzhiKyfrv/mocVxg9Wq/bJCXodySM6foZumYx6xyM9hmNXc3rbTMQDAB27ryoxfXmWNQm/ho/JGKz/JSDiCgwK2WBGW9vMSI7AJvjosDv5y43Zq5o7bo2gJ4pKftNzpKcqo69klMwIQT5uxAtGr8D4A1r366wcRkQlvN3IVzUKkTVL2sa+DtEBHbo5keHSJf6FYAr0Ur9aiKS68gSSReRwnzm+T5E27ozwoNvmGtjfJjY/sjToyJx3C50onb1KZDSJYsZAAob9p5SBrMztBUI1tZ6cz8UDXoQS0vC053CCcxIXmgkOloUZwD4QfDuRY8Gb1jLLV/7AavHd4dplrOsALgbIgrahKiidT+AhRAdmn5PRHkQEdjLIUT8dWvsaxD5x4kQgV+vWsf92LrU3yBSqVSIwLF/Wtd/iYieJaIvAPy22dyuIKIviGgbEf03lMtsWcIvEtEKIsonorvCjvkpEe0nojUQLSolknMCKcxnmJwlOY0ArsIZWG++ZLO5fkIBd7g94ulwLH1e7emdoWuubAA4ULsl83SubAWCnRrQZdHYGJeZnz+tRat8DHaPvRVP7wp1hmpOcFrSQiPZuaK1cz9vXD73W8Gs/SZTuOX9OpbW/KmD0w9nEppylgGgikVf6BSIILD5EOlSk63ArFKIQiGhzy7T2v8NiDXiVcycycyTINziIYv7eQixfhNC7J8Om0MGgDnM/MNmc1sDYBYzT4YQ8h+F7RsFYdXPAPAwEdmIaCrEOvgkiKC0but8JpH0dqQwR4CcJTlHIAJoOl3vuaMMKOVD3/7UHNf+yO6hOm54v/ZHtUXXhblOrxposJ5/Olc/r41AMAAoOja6xfVmAFiEz2YsxvutrhkHpyQuMlJbF+fV5oTx5wd+7/WzLQ+iY9MtnZh6OPkAhhDRnyFaLI6zrGcdwAqIHOQjEOU1vw1gNYClEIVGfgIg/ObgfgAXE9F2q/nFxRCCrEIEgt0BUVDkOQDp1hgHgH9xyzcpGQD+YwWhPQCcVAo2m5n9zFwOcbNQDXET8S4zNzJzLYAPuvieSCR9DinMESJnSc4aiFzQbscR4IZfv2wYJKyhHsfniDtuqvbh7Y9sHSJS0JSq02nKvEc73zgjDA2qa64+stVAMADYuePiGS2tNwPADfj7gkm8pVW3dXBS4iIj3bWitf0FnD5ghv+pgJftV2Bpjbe1cW3BzFUQzSJWQFSci7Os5yyITk6DrN9DIYR2NTO/D5EytZyZH4C1zMLMZB17I6y62cz8GYQYVzPzQGZOhujBHC6yrS0r/BnAk8w8HiJDIbw6XLgrv8t/AxLJ2YIU5giSsyTnRYg+tt3Kr18yttt1DOvu87ZGUfqcg910qi57EA7UbfWc7sVHGf3bDARjVh3bti52trTeDAD349EF/fho65bzhIRFen/3ilZ219Yg+uuuR8qOd27WJ4qJ/Mqyjj+HcBv/DMB0Inobwvq9D8ISHQhRM3s6gEeJaL51miFEtM7avtg6bxyES9sE8D8iesSyXouI6BgRvQIRSHZxs/m8R0RbIALEQqLtAfBPIvoVRE7/lLCa2QlEtN6ypkNBiqsg8qLXWOlXdwA9VxhHIulN9KgwE1E/InrLejyJiC7rwjlWENG0FrYXEFFSC9vXdW22LV67xWt0JzlLch5CN0Zqf+u/xqqMCsztrvN1hJKU6d2VhtXlHtbFjXnjOKwwR1dpKxAMALxez6DW1psJoF/j/ukxXLOtpf0AoI+LX6QPiGpuWQcAXFOwbPGOlo7pAFEANkCsDQ+AsHpfhXBNP2ZV8qoAMMHq1rQGou/xeGYOuedjIVKjHgTwU6us5k8hAsCCEOJ8DxEtgAgq6wdgtnjZmNFsPt+20qWWAphARInWYxeExf1XiJuEUM3sqwA8Y1nTOgAw81YABRDrz7UQYl7UxfdHIulT9KgwM3MRM19nPZ0EEcTRozDznJ6+Rg9wK0TO6Gkx/pC5a/Em7rHKXi3BIMPrSh7dTadrsZ50x+bBWr1etaf9kW0jAsGSWw0EA9peb9ag2/+AHwyxsf9AS/sBQB8Tt1DPjF7FomWiAeAbBcsWf3Ya0w5AuKJ3QIhmthWwNRbAk5bIlkJ0doqGWFv+Y9jx2wH8lplNZn4cgN86nnCyGJZBtHIsBFDAzMOZeQwz/5+1/05mfgvAXUS0A8APIMpvDrdc5gHr8QMQ68yZVtnONIiKYoAQ4lD5zmUQAv5fAL9h5l+dxnskkfQZOiXMRFQf9vg6InrJevwSET1BROuslIfrrO2ZRLSLiOwQ/Ym/ZgWTfI2Ioqw0iY1WCsVV1jEuIvonEeUS0bsQd9ltzclFRP8molvD50hEiyxr+y0i2ktErxERWfsus7Ztsea93NqeSESfENFuInoBTVWQQEQ/tF7LLiK6J+z17bVe/37rGhcS0VoiOkBEzS2JFslZkhOEsBr+3ZHxLeFp4PIH3zATSZRIPGNUxo/aA+Hy7AbotILhDtXlmN0xi/OCY9sMBANC681aiz2Xo9Do+R3ujlKsPsotoY/0LDAGR68G8J2CZYvfOs0pt1aLWoGIhA7Vr+7PzK01GQn3ElDY71+HHT+Mmf9q7WtxLZmIFkH0ca6ByJ3ehqb15LZqZp/SW5uZV0EErP0AwN+J6FutzF0iOavoTos5HcIVdjnEne4JrMpMDwEIVQZ6A8JN9hkzzwBwHoDfEVEUgO8BaGTm0QAehuhY0xrRAD4E8A9m/ksL+ycDuAfAGIhON3NJtCR8DsCllrstOWz8wwDWMPNYiCbwAwHASt24GaI5/CwAtxJRqG3iMIhWdqOsnxus9+F+dKIfc86SHB+Aq9GFmtrEbP7+BeOIyme+BOKxfvMqu/F0XbaYASC/bucoq67zaWEFgrXpNhXrzZe5mNFimlgyyvo9jJ/WQqzJtngKfYTn5YJli3uy4MwnCGugQkSTrId16Fhg4H8AfNuyskFE/cmqhd0GHohKYiZEsFlHPDhrIVKjAOGOD813EES+dD2Ea37KqYdKJGcf3SnM71musD0QLeLa42IAWZabbQXEXfVAiDvkVwGAmXdCtJhrjfcB/I2ZX2ll/8awIvzbIfI0RwHIZ+ZD1ph/hI0Pv3Y2xBcMIIT2XWZusCyOdyDSOQDgEDPnWNfYDeB/llWQg062t8tZkhOAaLX3ameOu/9tc7WnMTJfWlXxo5LbH9VR6LSE2W82JgbZf9rubAAYZfSf4WZHi1WtQni9nkH5edN2t7Z/GA6MvAt/OAjm5p4AE8C3j5836cWuzC0s2GsHEW2AZeGS6CZ1P4DLiWgTxN/RNBL1rvcCuJ2IKiBSnq4hokoiurfZuf8PgMv6v/ybtXk9ER2FKFKyAiKoKzT+GSLaDLHm/COIfGcNIojsToi173utMS4ieiTsctdZz4cAeI6I9kN0rwIRfQIh2GXWua8G8HhX3i+JpK/RWWEOdzc5m+1ryRXWFgTg2jA32UBmzu3kfNYC+FLIRd0CzdMweqJMYPg1zLDnZleul7MkxwCwBCJntF0W7TQ3TjvACzp7ne4gYIspN1RHd60v43SFGQCKGvNOLZHZRS4LTE5pKxAMAIqKRs+urUlusS42AMzE+inX4Z9fhG0KArjh+HmTXjqNqUUB2GAFda0C8Gtr++MA7mfmJIg8+T8w89cgggvvA/AkRK7zcGaeABEQ9jwz32StDYOZH2JmFcAiiLra34e4WdwOIIGZx0C4qUOVvX7KzNMglpxmABjJzJdClOq8n5kXAbjZGmMHsJCIJljXKwdQbqVlPQBR0ORnAF6E8FxlAPgmRGnQK8JupiWSs5rOCnMJEY0mkXN6TSePbe4++w+AO8PWfUOu4VUQ7mAQ0TiIvMvWeAjCqn2qE/PYB5Eakmk9/1rYvvBrXwrRbQcQwTJXE5HbcrdfY23rEXKW5Jg5S3JugyiL2CpplXz0e9nmSOrYjVC3U5w2cz9avynqAqcvzAdrt55moZMm4jhqUKaZ3G5ZzJ07L5rZ2nozAFyDt+bN5tUrIdZlrzx+3qQ3WhvbQQIQZTQBUXIz03p8IZqCvT4AEBsW7LXA+nkGwHgi6g9RGeyUtWLrf/JVAH9k5i0ALoBYUtpknfsCCCsXAL5KRFsh1pLHQiwbNaetMaGlm/DX0ZrnSiI5J+isMGdBfCGsA9BqYEsrfA5gTCj4CyJ/1wZgJxHtRlM+7zMAookoFyJgbEs7570bwkX223bGAQCY2QthBXxMIteyDjjRwP4RAAus+XwZokpSKHXjJQAbIUobvsDMrabEdBc5S3LuRZjbMBybzr7fvmg0kFjTiwjH02aeErBzetBpF5eo8BeNMNns7N9mqywKjp3ZXiBYe+vNAPAD/GnkTF43//h5kz7uhml1ONgLQqyLIZZe5kO4ossAXIfWby6XAihk5pArmwC8HHbekcy81HKj/xTABZYFno1mnjQiGgzhXm9tTMgj0VMeLYmkz9GpfwTL/XRKBCk3a+PGVps3K2dynPW4EqfWu72thXN50RQI0tZcMsOe3tzCtVdAfAmFtv8gbPznzDzKsgyegiiDCGauQLNiCWHH/xEnp5ic9Pqs5ze1tq+r5CzJ+dn4l8cfhnBDnoi4/uUrxmZnED3aX7ktGOAGd1r3NhYgxTg1NrfzVPmPH0x09uuWQLhQINga296MtsaJ9ebp64cO2zS7hd27AVz+/vnfL+iOObVBKNjrd8CJoMWrIW6mkwDYmTmfRFOI+yGinU+CiK6AEPPzwjb/D8D7RPQYM5cSUQKE90uFqApWQ6JYyKUI+5+ziIXwFLQ1pjkhz9Uvm3muJJJzgnO18tetlktuN4TF+Vxkp9M2OUty/gKx5lcMAF9baawZXBI5UQaAGs+wvSClm4uvULekO+XVbW8e/3BajDL6z4hqJxAMAIqKRs2uOXW9+QMAsy84P6+gK9e2Ar0es1L4/mcFeIUK9myAyAg4j4jiAdwF4AEiKiMiL0RziSshhDoJomLXCgiLuT+APSRqXMNapnkTosHEJABVRLTPCga7E+K74jARlUBUA0uHENx9EEFhr0PEfJyElVu9ra0xLdCi50oiOVegJo+YpLcz/uXx6WMLzCce+od5OZ0afHdG2T36ppUlqdO7tXOVr/rZLeDGttLjOoRKWuO1g36oWKlx3UI1NRx+y74hDQRHW+OIDP/sOW/mq6o+EmJ55pELzs/r8j8ZETGAG5n5NSJ6CEAKM/+ARJnKO5l5pSWescx8jyW8e5j5+9bxL0EUHwlV4FsBEZS1mURVu83MnElE90MEhd1mxXZsh3CLbyaiBGauJCIVwnq+i5l3hp+rq69PIpGcyrlqMfdJcpbkFD/8D/MGEuvwEaUiYWxC959V6RaL2WDd7TXqd3XHuUJYgWBtVgQDxHrz9m2X+gBcdsH5eUtPR5QtTDS1W3wVwDwi8kA0qAiV9nwZImAqRFeCy+bB6qvMzLtwcppiRwK8JBJJNyGFuY8xem9ucPTe3B9CrB1GJFo1qLlqdM3V7V/ORN0jzABwpCG3sbvOFWKRqAjWXherzxsb4y6/4Py8/3Tm3ET0FRLV7j5vZ2hHhL61Dk+AKOIS+r9v16PQgeAtiUTSzUhh7qOM3pv7PkRls/+e6WuXpE7fA+HW7Ga6T5gP1m4b0v6ozqFBdc3TR7UW8e2HyMW9cOnSpV1ptvAdALcy83nNtisQEdSACIhaw6JZRxU1dYb6JoDWWk42T1MsQFM1vevCtq+FyFcGEY0BMN7a3lLwlkQi6UFkekIfZvTe3MMALsodNfqbEBHjPdoJK0RR2uwe6pnbfcLcoFdn6GbwgKbYTqtPdHNGGv1mbNXyNzWQPzzDYBOAm5cuXdpqFbC2sNaO5wH4KxF9ABGU+GWIkrMmRCnZFyCs5aMk6sovAfA3IhoN4DgALxGNhXWzTUTDADwLURbzFmsN+UqIoiF/IKI/WvMO8TSAl4loD0Sg1m4ANcx8gIhCwVtH0bHgLYlEchpIi/ksYPTe3L9DlBrtybrLJ6iPzhjaIycmtVsjEUt9R3qkTeClgcmpYPgANAL4MYDZXRVlALC6M20G8A2r8xIg6kJfB5GOdC+AfswcA7GW/AcAOyAK3WgArrZqy1dDVPLaDOA1AE8x83CIdKPpAIYCiIOoHBYF0U4x1BjCBxFkNgbC8vcAOGzN7yZmHsHMFzDzl5n5JWv7Ihn4JZF0P9JiPksYvTe3AsBNuaNGvwJhKXWrpRiiNmbgAZDSI+cGuleYD9Ruje/n7v57iDiOGjjK6P/4Xu3YH5cuXdpTqTyfWpHQgCjw8SiJXsgmRKpTqB79IWbebj3eAiCTiGIA9GfmdwGAmX0AQEQXQ+Tph4rjREP8nawC4AbwORHZrOt932o+I5FIzjBSmM8yRu/N/Sx31OgJAH4GEbTTZnpPZzmWPq8IPST6IKVbhbnEe2gsM1dZOb7dxU4A917/y1tPp39yR2gARMEcIroJogvaVGYOWrnHoQCs5vXg22qTGmrjeErePjPXAZjWDfOWSCSniXRln4WM3pvrG70392cARkB0COq2NeHypAmx3XWu5lA3W8wMVmuDFd3SbQqiKMftAKZkLJvf06LcHA+AUkuUz4NYN24VS2QLiehqACAiBxG50bU2jhKJ5AwjhfksZvTe3COj9+Z+GyL39F/oWKpNqxiKvSFoix7bLZNrke4P9D5Un3O6TTaqIOqVD89YNv+5jGXzeyjwrU1eg2jfmAOxJtxqw4wwvgngLqsQyToAacz8CUT1rfXWud5Cx/oySySSM4is/HUOkTtq9BgAD0LUIu+0Chalzdq4d9Q3Z3T7xCwC9R+sMIMHF3XnOe2Ks/rqgXfFUOfTuwoBPAbg+Yxl8+u7c04SiUTSFtJiPocYvTd3z+i9uTcCGAlRH7yuM8cXpc/19cjETqB2e/vKgOmLC5i+zlQB2wXRFGVIxrL5f5SiLJFIzjQy+OscZPTe3DwAt+eOGn0fRFGJWwDMae+4uphBg3t0Yt2cLhXiWOOB6iExbbX1RhCiL/DTGcvmN29CIZFIJGcUKcznMKP35jZABIf9LXfU6FEQ1ae+BeCUgKB6d3oBK2pmT86HesBiBoCDtVv7tyLMBQD+CuAvGcvml/TEtSUSiaSzSGE+QxCRxsx6pOfRGqP35u4F8EDuqNEPArgCwI0QOa9RAFDUb+4RAJk9OgnqmT/HqkDJMJONQoXUDAC5ENbxuxnL5m/pkQtKJBLJaSCFuRMQ0XcgKj1VQ1Re8lst+JIhinoMtIbew8xriWgpRLWlIQCOENE+AIOt5wMhKjrNgqg/fAzAFVZKzEMQ4uiCiKi9jZnZarP3BUQT+zgA32Hm1US0CqIV33ZrnmsA3GH1wu0Uo/fmhty67+SOGu2wrnV5eeKEnqn2dRJqT8Q86ADWH23Y949B0WM+y1g2f18PXEMikUi6DSnMHYSI+gH4OUSpxDoAn0GIMwA8DuAxZl5DRAMh8kVHW/vGAJjHzN4woT7P2r4ewLXM/CMiehfAYgDvAXjSKtMIIvo7gMsBfGidT2PmGUR0GYCHAVwI4Y69CcA9RDQCgLMrotyc0Xtz/QA+BvDxaABP3f7ZUAAXWfOfDnGT0X10j8XsgyhvuR6irvOK+95YXtMdJwYAIvoIopkEANzAzE934Jh6Zo7urjlIJJKzGynMHWcGgJXMXAkARPQviAIegBDHMVb5RACIDRVxAPABM3vDzvNvyyrOgUhZ+tjanoMmV/F5RPQjiDKJCRANBULC/I71e0vY+H8B+DkRPQDg2wBeOq1X2gp3PHt+HoA8CO8Anrr9swSIalHTrd9TAWRAVJjqNAStsxZzI4RrejeArRBivO2+N5YHu3L9jsDMlwEAEWUC+D5E8weJRCLpNqQwdw8KgFmhmsQhLKFu3hvXDwDMbBJRkJsSyU0AGhE5Ib7spzHzUcvKdjY/HqKal2adq5GIPgVwFUSU9VScAe549vxKAJ9YPwCAp27/zA3hqh8GUaFqIIABEAFlMRBtBEO/Ty4fSSeCvwIQolsOoARAqfW7BEARgIPWz9H73lh+RhPxrXKY0wAsAzCUiLYD+BTAIwDeh2gYYQPwM2Z+v9mxrwB4h5nfs56/BuDN5uMkEsm5jRTmjrMJwJ+sust1AK6FsHIBIUx3AvgdABDRpLDGAp0lJMLlltV9HUSFpvZ4AcKqXs3MVV289mlzx7PnN0LkArebO/zU7Z9pEF4BADBITdEBBO97Y3m3tX/sQbIAjGPmSYAI7gNwDTPXElESgA1E9EHYjRcglhzuBfAeEXkgUtSWnOF5SySSXo4U5g7CzMeI6FEAGyF62u4FEFq7vAvAU1b5Qw2iW8/tXbxONRH9BULYjuPknrltHbeFiGoh0p/6BHc8e74O0XowjD6rU611gDoeGsDMK4noaStY8FoAb/fmSH2JRBIZZEnOTkBE0cxcb1lH7wJ4MdRaL9JYwWkrAIxi5r5gcfZJwlzZ0QCWM/M4a/tNENH1N4Z1gFrEzAXhwV9E9GMIV/31AG5m5u5qsiGRSM4SZEnOzrHUWlPcBeAQRAR1xCGib0GkUf1UinL3QESZRHRDG0PqcHIDiPAOUF6I9fUUImq+DPESgHsAQIqyRCJpCWkxSzoNEU0D8C1mvivSc+kpiGgRgPuZ+fJm2wsAzGTmEiJ6HcAEAP8G8BuINf5oAKMggtMubW4xW+f4GMB7zPzsmXgtEomkbyEtZkmnYebNvVmUiegZItpMRLuJ6JGw7QVWYBaIaJpVsAVEtJCItls/24goBiLqer617V4iuomIPgCQD+BNKzAvFcIt/SUAc5l5NjOPhyg8M9o69y5mjrYs8NVEtA0iDzzvzL0jEomkLyGF+RyCiFQieomIdhFRDhHda21fQUSPWyK0i4hmWNtnENF6S6zWEdFIa/siIlpuPV5KRC9a58gnot4g2D9l5mkQ1uxCImqzgwWA+yEqpU0CMB+AFyLqejUzT2Lmx6xxUwBcx8wLIQqZXMPMUyCE9g8UlsjeAqUAHoXIS/8dgF937aVJJJKzHRmVfW4xCUD/sICluLB9bmaeZEUVvwhgHETk+Xxm1onoQghhubaF846CEKcYAPuI6Blm7rEiHx3gq0T0XYi/73SIKms72xi/FsAfrbzid5i5sBWN/TRUYAYdiMJuhg2iYlgtRCW3Ea2Mk0gk5zhSmM8t8gEMIaI/A8hGWGEQAP8AAGZeRUSxlmjHAHiZiIYDYAhxaYlsZvYD8BNRKYRAFfbQa2gTIhoMYQFPZ+YqInoJTbnhOpq8RCeKtjDzMiLKBnAZgLVEdEkrpw8vFvMNAMkApoZFYTtbPEpwL0SBlInWHHq4t7VEIumrSFf2OYRVeGQiRFrV7RBFSU7sbj4cwC8AfG5Z2FegdeHxhz0+UZEsQsRCCGgNEaVCpDCFKEBTVbQTlj8RDWXmHGb+DUTe+CicGnXdnPAo7PMgorDbwgOg2Iqa/yZEOVaJRCI5BSnM5xBW4JPCzG8D+BnEmmmIr1lj5gGoYeYaCDE5Zu2/6QxOtctYzTu2QbjhX4dwU4d4BMDjRLQZ4gYixD3W2vpOAEGIKOudAAwi2hFai2/GawCmkah5/i3rem3xNIAlRLQDQvibl2qVSCQSANKVfa7RH8DfiCh0Q/aTsH0+K2LYBtEIAwB+C+HK/hmE67tPwMw3tbJ9NVpY22XmO1s51fnNnr8Udkw5gNmtXCfa+l0AsVYPZj4AEYwW4setXFMikZzjyDxmCay0ofuZeXOk5yKRSCTnOtKVLZFIJBJJL0JazBKJRCKR9CKkxSyRSCQSSS9CCrNEIpFIJL0IKcwSiUQikfQipDBLJBKJRNKLkMIskUgkEkkvQgqzRCKRSCS9CCnMEolEIpH0IqQwSyQSiUTSi5DCLJFIJBJJL0IKs0QikUgkvQgpzBKJRCKR9CKkMEskEolE0ouQwiyRSCQSSS9CCrNEIpFIJL2I/wdaIxlHlCzA/gAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.pie(\n",
    "    location_value_counts,\n",
    "    labels = location_value_counts.index\n",
    "    \n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 分析年龄"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0          True\n",
       "1         False\n",
       "2          True\n",
       "3         False\n",
       "4          True\n",
       "          ...  \n",
       "278853     True\n",
       "278854    False\n",
       "278855     True\n",
       "278856     True\n",
       "278857     True\n",
       "Name: age, Length: 278858, dtype: bool"
      ]
     },
     "execution_count": 88,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user['age'].isnull()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>russia</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>united kingdom</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>7</td>\n",
       "      <td>usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id         location  age\n",
       "0        1              usa  NaN\n",
       "2        3           russia  NaN\n",
       "4        5   united kingdom  NaN\n",
       "6        7              usa  NaN\n",
       "7        8           canada  NaN"
      ]
     },
     "execution_count": 89,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user[df_user['age'].isnull()].head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>18.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>portugal</td>\n",
       "      <td>17.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>6</td>\n",
       "      <td>usa</td>\n",
       "      <td>61.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>10</td>\n",
       "      <td>spain</td>\n",
       "      <td>26.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>11</td>\n",
       "      <td>australia</td>\n",
       "      <td>14.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    user_id    location   age\n",
       "1         2         usa  18.0\n",
       "3         4    portugal  17.0\n",
       "5         6         usa  61.0\n",
       "9        10       spain  26.0\n",
       "10       11   australia  14.0"
      ]
     },
     "execution_count": 90,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user_age_notnull = df_user[~df_user['age'].isnull()]\n",
    "df_user_age_notnull.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {},
   "outputs": [],
   "source": [
    "age_value_counts_by_age = df_user_age_notnull['age'].value_counts().sort_index(axis = 0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.0      416\n",
       "1.0      288\n",
       "2.0      105\n",
       "3.0       45\n",
       "4.0       28\n",
       "        ... \n",
       "230.0      1\n",
       "231.0      1\n",
       "237.0      1\n",
       "239.0      1\n",
       "244.0      1\n",
       "Name: age, Length: 165, dtype: int64"
      ]
     },
     "execution_count": 92,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "age_value_counts_by_age"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(\n",
    "    age_value_counts_by_age.index,\n",
    "    age_value_counts_by_age \n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "metadata": {},
   "outputs": [],
   "source": [
    "#  对年龄再进行更细致的划分"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "metadata": {},
   "outputs": [],
   "source": [
    "def divided_age(age):\n",
    "    \"\"\"\n",
    "    return\n",
    "        Nan,0-6,>100  --> 0 年龄填写有误\n",
    "        7 - 12        --> 1 少儿\n",
    "        13 - 17       --> 2 青少年\n",
    "        18 - 45       --> 3 青年\n",
    "        46 - 69       --> 4 中年\n",
    "        70 - 100      --> 5 老年\n",
    "    \"\"\"\n",
    "#     if np.isnan(age) or (age == 0) or ( age <=6) or (age >=100):\n",
    "#         age = 0\n",
    "    if np.isnan(age) or (age <= 6) or (age > 100):\n",
    "        return 0\n",
    "    if age >=7 and age <=12:\n",
    "        return 1\n",
    "    if age >= 13 and age <= 17:\n",
    "        return 2\n",
    "    if age >= 18 and age <= 45:\n",
    "        return 3\n",
    "    if age >= 46 and age <= 69:\n",
    "        return 4\n",
    "    if age >= 70 and age <= 100:\n",
    "        return 5\n",
    "\n",
    "df_user['age'] = df_user['age'].apply(divided_age)\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>russia</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>portugal</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>united kingdom</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id         location  age\n",
       "0        1              usa    0\n",
       "1        2              usa    3\n",
       "2        3           russia    0\n",
       "3        4         portugal    2\n",
       "4        5   united kingdom    0"
      ]
     },
     "execution_count": 96,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 分析年龄段"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.pie(\n",
    "    df_user['age'].value_counts().sort_index(),\n",
    "    labels=['undefined','shaoer','qingshaonian','qingnian','zhongnian','laonian']\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 分析打分表"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 读取数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 112,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>User-ID</th>\n",
       "      <th>ISBN</th>\n",
       "      <th>Book-Rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>276725</td>\n",
       "      <td>034545104X</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>276726</td>\n",
       "      <td>0155061224</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>276727</td>\n",
       "      <td>0446520802</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>276729</td>\n",
       "      <td>052165615X</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>276729</td>\n",
       "      <td>0521795028</td>\n",
       "      <td>6.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   User-ID        ISBN  Book-Rating\n",
       "0   276725  034545104X          0.0\n",
       "1   276726  0155061224          5.0\n",
       "2   276727  0446520802          0.0\n",
       "3   276729  052165615X          3.0\n",
       "4   276729  0521795028          6.0"
      ]
     },
     "execution_count": 112,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_rating = pd.read_csv('./data/BX-Book-Ratings.csv',sep=';')\n",
    "df_rating.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 113,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>item_id</th>\n",
       "      <th>book_rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>276725</td>\n",
       "      <td>034545104X</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>276726</td>\n",
       "      <td>0155061224</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>276727</td>\n",
       "      <td>0446520802</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>276729</td>\n",
       "      <td>052165615X</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>276729</td>\n",
       "      <td>0521795028</td>\n",
       "      <td>6.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id     item_id  book_rating\n",
       "0   276725  034545104X          0.0\n",
       "1   276726  0155061224          5.0\n",
       "2   276727  0446520802          0.0\n",
       "3   276729  052165615X          3.0\n",
       "4   276729  0521795028          6.0"
      ]
     },
     "execution_count": 113,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_rating.columns = ['user_id','item_id','book_rating']\n",
    "df_rating.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 1149780 entries, 0 to 1149779\n",
      "Data columns (total 3 columns):\n",
      " #   Column       Non-Null Count    Dtype  \n",
      "---  ------       --------------    -----  \n",
      " 0   user_id      1149780 non-null  int64  \n",
      " 1   isbn         1149780 non-null  object \n",
      " 2   book_rating  1149772 non-null  float64\n",
      "dtypes: float64(1), int64(1), object(1)\n",
      "memory usage: 26.3+ MB\n"
     ]
    }
   ],
   "source": [
    "df_rating.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 删除 book_rating 中 错误的数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 121,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 1149772 entries, 0 to 1149779\n",
      "Data columns (total 3 columns):\n",
      " #   Column       Non-Null Count    Dtype  \n",
      "---  ------       --------------    -----  \n",
      " 0   user_id      1149772 non-null  int64  \n",
      " 1   item_id      1149772 non-null  object \n",
      " 2   book_rating  1149772 non-null  float64\n",
      "dtypes: float64(1), int64(1), object(1)\n",
      "memory usage: 35.1+ MB\n"
     ]
    }
   ],
   "source": [
    "df_rating = df_rating.dropna()\n",
    "df_rating.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 用户活跃度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "11676     13602\n",
       "198711     7550\n",
       "153662     6109\n",
       "98391      5891\n",
       "35859      5850\n",
       "          ...  \n",
       "158698        1\n",
       "17920         1\n",
       "277135        1\n",
       "275086        1\n",
       "187812        1\n",
       "Name: user_id, Length: 105283, dtype: int64"
      ]
     },
     "execution_count": 114,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#用户活跃度 就是用户评分表中 user_id 的数量\n",
    "user_value_counts = df_rating['user_id'].value_counts()\n",
    "\n",
    "user_value_counts"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(\n",
    "    range(len(user_value_counts)),\n",
    "    user_value_counts\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 商品活跃度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0971880107    2502\n",
       "0316666343    1295\n",
       "0385504209     883\n",
       "0060928336     732\n",
       "0312195516     723\n",
       "              ... \n",
       "0304327158       1\n",
       "0445031549       1\n",
       "207029238X       1\n",
       "8804447915       1\n",
       "0385198086       1\n",
       "Name: item_id, Length: 340557, dtype: int64"
      ]
     },
     "execution_count": 117,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "item_value_counts = df_rating['item_id'].value_counts()\n",
    "item_value_counts"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 118,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYkAAAD4CAYAAAAZ1BptAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAAU0UlEQVR4nO3db4xd9X3n8fd3ZjwOYAom9nq9tlND6iqlq61Dp0DUqEoVhX9PSKQ0ggfBpZFctSAlUlda00qFtkLKrjbJit0sjaM4kN00lCqJYlVOHZdQRX0Q8EAdsCEOE/6sPTV4EohJ+Gdm/N0H9zfJ9TBn/p0zd2ZO3y/p6p77O79zzvccX89n7jm/eyYyE0mSptO31AVIkpYvQ0KSVMmQkCRVMiQkSZUMCUlSpYGlLmAm69aty61bty51GZK0ojzyyCM/ysz1TaxrWYfE1q1bGR4eXuoyJGlFiYjnmlqXp5skSZUMCUlSJUNCklTJkJAkVTIkJEmVZg2JiNgSEQ9GxBMRcSQiPl7a74iI0Yg4VB7XdS1zW0SMRMTRiLi6q/2a0jYSEbsWZ5ckSU2ZyxDYceBPMvPRiDgfeCQiDpR5n8nM/97dOSIuBW4Afh34D8A/RsSvltmfBT4AHAcORsTezHyiiR2RJDVv1k8SmXkiMx8t0z8FngQ2zbDI9cB9mflGZj4DjACXl8dIZj6dmaeB+0rfxr16epxPf+so//L/XlqM1UvSvxnzuiYREVuBdwMPlaZbI+KxiNgTEWtL2ybgWNdix0tbVfvUbeyMiOGIGB4bG5tPeT/32ukJ7vr2CI+PnlrQ8pKkjjmHRESsAb4KfCIzXwbuBt4JbAdOAJ9qoqDM3J2ZQ5k5tH59I98qlyQt0JxuyxERq+gExJcz82sAmflC1/zPA39fXo4CW7oW31zamKFdkrQMzWV0UwBfAJ7MzE93tW/s6vYh4HCZ3gvcEBGrI+JiYBvwMHAQ2BYRF0fEIJ2L23ub2Q1J0mKYyyeJ3wY+CjweEYdK258CN0bEdiCBZ4E/BMjMIxFxP/AEnZFRt2TmBEBE3ArsB/qBPZl5pLE9kSQ1btaQyMx/BmKaWftmWOZO4M5p2vfNtFzTMnu1JUlqp1Z+47pzhkySVFcrQ0KS1AxDQpJUyZCQJFUyJCRJlVodEunwJkmqpZUh4dgmSWpGK0NCktQMQ0KSVMmQkCRVMiQkSZUMCUlSpVaHhANgJameVoaE9/eTpGa0MiQkSc0wJCRJlQwJSVIlQ0KSVKnVIeH9/SSpnlaGRHiLP0lqRCtDQpLUDENCklTJkJAkVTIkJEmVWh0SDm6SpHraGRIObpKkRrQzJCRJjTAkJEmVDAlJUiVDQpJUqdUhkd68SZJqmTUkImJLRDwYEU9ExJGI+HhpvygiDkTEU+V5bWmPiLgrIkYi4rGIuKxrXTtK/6ciYsdi7ZR/mU6SmjGXTxLjwJ9k5qXAlcAtEXEpsAt4IDO3AQ+U1wDXAtvKYydwN3RCBbgduAK4HLh9MlgkScvTrCGRmScy89Ey/VPgSWATcD1wb+l2L/DBMn098KXs+C5wYURsBK4GDmTmi5n5EnAAuKbJnZEkNWte1yQiYivwbuAhYENmniizngc2lOlNwLGuxY6Xtqr2qdvYGRHDETE8NjY2n/IkSQ2bc0hExBrgq8AnMvPl7nnZuULcyFXizNydmUOZObR+/fomVilJWqA5hURErKITEF/OzK+V5hfKaSTK88nSPgps6Vp8c2mrapckLVNzGd0UwBeAJzPz012z9gKTI5R2AN/oar+pjHK6EjhVTkvtB66KiLXlgvVVpa1xDm6SpGYMzKHPbwMfBR6PiEOl7U+BTwL3R8THgOeAj5R5+4DrgBHgVeBmgMx8MSL+CjhY+v1lZr7YxE5IkhbHrCGRmf9M9S/n75+mfwK3VKxrD7BnPgVKkpZOq79xLUmqx5CQJFVqdUh46yZJqqeVIRHevEmSGtHKkJAkNcOQkCRVMiQkSZUMCUlSJUNCklSp1SGRzdyYVpL+zWplSDgAVpKa0cqQkCQ1w5CQJFUyJCRJlQwJSVKlVoeEN/iTpHpaGRLe30+SmtHKkJAkNcOQkCRVMiQkSZUMCUlSpVaHhIObJKmeVoZEePcmSWpEK0NCktQMQ0KSVMmQkCRVMiQkSZVaHRLeu0mS6mllSHjvJklqRitDQpLUjFlDIiL2RMTJiDjc1XZHRIxGxKHyuK5r3m0RMRIRRyPi6q72a0rbSETsan5XJElNm8sniXuAa6Zp/0xmbi+PfQARcSlwA/DrZZn/HRH9EdEPfBa4FrgUuLH0lSQtYwOzdcjM70TE1jmu73rgvsx8A3gmIkaAy8u8kcx8GiAi7it9n5h/yZKkXqlzTeLWiHisnI5aW9o2Ace6+hwvbVXtbxEROyNiOCKGx8bGapQH6d2bJKmWhYbE3cA7ge3ACeBTTRWUmbszcygzh9avX9/UaiVJCzDr6abpZOYLk9MR8Xng78vLUWBLV9fNpY0Z2iVJy9SCPklExMaulx8CJkc+7QVuiIjVEXExsA14GDgIbIuIiyNikM7F7b0LL1uS1AuzfpKIiK8A7wPWRcRx4HbgfRGxnc6fbHgW+EOAzDwSEffTuSA9DtySmRNlPbcC+4F+YE9mHml6ZyRJzZrL6KYbp2n+wgz97wTunKZ9H7BvXtVJkpZUq79x7b2bJKmeVoaE926SpGa0MiQkSc0wJCRJlQwJSVIlQ0KSVMmQkCRVMiQkSZVaGRKBY2AlqQmtDAlJUjMMCUlSJUNCklTJkJAkVWp1SKR3+JOkWloZEt7gT5Ka0cqQkCQ1w5CQJFUyJCRJlQwJSVKlVoeEg5skqZ5WhoSDmySpGa0MCUlSMwwJSVIlQ0KSVMmQkCRVanVIOLhJkuppZUiEN2+SpEa0MiQkSc0wJCRJlQwJSVIlQ0KSVGnWkIiIPRFxMiIOd7VdFBEHIuKp8ry2tEdE3BURIxHxWERc1rXMjtL/qYjYsTi7czbv3SRJ9czlk8Q9wDVT2nYBD2TmNuCB8hrgWmBbeewE7oZOqAC3A1cAlwO3TwbLYnBskyQ1Y9aQyMzvAC9Oab4euLdM3wt8sKv9S9nxXeDCiNgIXA0cyMwXM/Ml4ABvDR5J0jKz0GsSGzLzRJl+HthQpjcBx7r6HS9tVe1vERE7I2I4IobHxsYWWJ4kqQm1L1xnZtLgl5szc3dmDmXm0Pr165tarSRpARYaEi+U00iU55OlfRTY0tVvc2mrapckLWMLDYm9wOQIpR3AN7rabyqjnK4ETpXTUvuBqyJibblgfVVpW1Tp3ZskqZaB2TpExFeA9wHrIuI4nVFKnwTuj4iPAc8BHynd9wHXASPAq8DNAJn5YkT8FXCw9PvLzJx6Mbwx3rpJkpoxa0hk5o0Vs94/Td8EbqlYzx5gz7yqkyQtKb9xLUmqZEhIkioZEpKkSoaEJKlSq0PCG/xJUj2tDAn/fKkkNaOVISFJaoYhIUmqZEhIkioZEpKkSq0OCQc3SVI9rQ4JSVI9hoQkqZIhIUmqZEhIkioZEpKkSu0OCW/eJEm1tDYkvH2TJNXX2pCQJNVnSEiSKhkSkqRKhoQkqVKrQ8KxTZJUT2tDwsFNklRfa0NCklSfISFJqmRISJIqGRKSpEqtDglv3SRJ9bQ2JMKbN0lSbbVCIiKejYjHI+JQRAyXtosi4kBEPFWe15b2iIi7ImIkIh6LiMua2AFJ0uJp4pPE72bm9swcKq93AQ9k5jbggfIa4FpgW3nsBO5uYNuSpEW0GKebrgfuLdP3Ah/sav9SdnwXuDAiNi7C9iVJDakbEgl8KyIeiYidpW1DZp4o088DG8r0JuBY17LHS9tZImJnRAxHxPDY2FjN8iRJdQzUXP69mTkaEf8OOBAR3++emZkZEfMaY5SZu4HdAENDQ45PkqQlVOuTRGaOlueTwNeBy4EXJk8jleeTpfsosKVr8c2lbdGkt/iTpFoWHBIRcV5EnD85DVwFHAb2AjtKtx3AN8r0XuCmMsrpSuBU12mpxjkAVpLqq3O6aQPw9fJ9hAHgbzLzHyLiIHB/RHwMeA74SOm/D7gOGAFeBW6usW1JUg8sOCQy82ngN6Zp/zHw/mnaE7hloduTJPVea79xLUmqz5CQJFVqdUh4gz9Jqqe1IeH9/SSpvtaGhCSpPkNCklTJkJAkVTIkJEmVWh0SDm6SpHpaGxLh3ZskqbbWhoQkqT5DQpJUyZCQJFUyJCRJldobEgFnvHmTJNXS2pBY1RdMTBgSklRHe0NioI83J84sdRmStKK1NyT6+zhtSEhSLa0NicH+Pk6Pe7pJkupobUis6g9PN0lSTa0NicGBPk6PGxKSVEdrQ+KcwQFeOT2+1GVI0orW2pBYs7qfV94wJCSpjhaHxAA/fd2QkKQ6WhsSF503yE9ee3Opy5CkFa21IbFuzWp+/LM3GHeEkyQtWGtDYsvaczmTcOyl15a6FElasVobEr+28ZcAeHz01BJXIkkrV4tD4nwuOGcV+488v9SlSNKK1dqQGOjv4/d+czPffPwEh/00IUkL0tqQAPjj3/0V1q1Zze9/8WH+6ehJ0r8vIUnz0vOQiIhrIuJoRIxExK7F3NZF5w3yxZt/i1X9ffz+Fw9y9f/4Dp/85vfZf+R5nvnRK962Q5JmEb387Toi+oEfAB8AjgMHgRsz84np+g8NDeXw8HDt7b7+5gR/N3yMrz46yveO/4TJXY7oDJV9+3mDXHjuKs4bHGDdmtUMDvSxqr+PC89dxbmD/fT3xc8f5w0OsGb1AH19EBH0RdAX0B9RXsNAf3DBOYP09wVRthMEEd3HorP81PkBMOV1RHDOqn7OGeyvfSwktV9EPJKZQ02sa6CJlczD5cBIZj4NEBH3AdcD04ZEU962qp+PvmcrH33PVn72xjhHRk/xw7FXOPbSq7z4s9OcePl1Xjs9zjM/foXD/3qKNyeS19+c4NXTE4tZ1rx1hwyUQDlrfswwb+qyM69spuWnLjufut4yf77LzqP/BeesYqBvag9pZXjXxl/if9747qUuo+chsQk41vX6OHBFd4eI2AnsBHjHO97ReAFrVg9wxSVv54pL3j5r39dOTzB+5gwTZ5LxM8n4RPLiK6eZOJOcyclH529pnznTmc5MXjk9wStvjJMkmXQeZZ2Z2ZlOfjGfyT6/eE3pl2Wdp14bZ+LML06PTf381/2BMKfMnfphcaZlp1uenHby5/uz0G3NVudUb9nWDOt+c+IML7/uN+61cm1Ze85SlwD0PiRmlZm7gd3QOd20lLV0Tu+cfYrn31/wtqUpRpKWQK8vXI8CW7peby5tkqRlqNchcRDYFhEXR8QgcAOwt8c1SJLmqKenmzJzPCJuBfbTOY+zJzOP9LIGSdLc9fyaRGbuA/b1eruSpPlr9TeuJUn1GBKSpEqGhCSpkiEhSarU03s3zVdEjAHP1VjFOuBHDZXTCyutXrDmXlhp9YI198JM9f5yZq5vYiPLOiTqiojhpm5y1QsrrV6w5l5YafWCNfdCr+r1dJMkqZIhIUmq1PaQ2L3UBczTSqsXrLkXVlq9YM290JN6W31NQpJUT9s/SUiSajAkJEmVWhkSEXFNRByNiJGI2LUE2382Ih6PiEMRMVzaLoqIAxHxVHleW9ojIu4qtT4WEZd1rWdH6f9UROzoav/Nsv6Rsuy8/0ZnROyJiJMRcbirbdFrrNpGjZrviIjRcqwPRcR1XfNuK9s/GhFXd7VP+/4ot7B/qLT/bbmdPRGxurweKfO3zrHeLRHxYEQ8ERFHIuLjy/04z1Dzcj7Ob4uIhyPie6Xmv1jodpralwXWe09EPNN1jLeX9qV9X2Rmqx50bkH+Q+ASYBD4HnBpj2t4Flg3pe2/AbvK9C7gv5bp64Bv0vlzzVcCD5X2i4Cny/PaMr22zHu49I2y7LULqPF3gMuAw72ssWobNWq+A/jP0/S9tPzbrwYuLu+JyT81OO37A7gfuKFM/zXwR2X6j4G/LtM3AH87x3o3ApeV6fOBH5S6lu1xnqHm5XycA1hTplcBD5VjMq/tNLkvC6z3HuDD0/Rf0vfFkv5AX4wH8B5gf9fr24DbelzDs7w1JI4CG8v0RuBomf4ccOPUfsCNwOe62j9X2jYC3+9qP6vfPOvcytk/cBe9xqpt1Kj5Dqb/4XXWvzudv2Hynqr3R/nP9CNgYOr7aHLZMj1Q+sUCjvc3gA+shOM8Tc0r4jgD5wKPAlfMdztN7ssC672H6UNiSd8XbTzdtAk41vX6eGnrpQS+FRGPRMTO0rYhM0+U6eeBDWW6qt6Z2o9P096EXtRYtY06bi0fw/d0fXyeb81vB36SmePT1PzzZcr8U6X/nJVTGu+m81vjijjOU2qGZXycI6I/Ig4BJ4EDdH7zn+92mtyXedWbmZPH+M5yjD8TEaun1jvHuhp9X7QxJJaD92bmZcC1wC0R8TvdM7MT48t67HEvamxoG3cD7wS2AyeAT9VcX+MiYg3wVeATmfly97zlepynqXlZH+fMnMjM7cBm4HLgXUtb0cym1hsR/5HOp5N3Ab9F5xTSf1nkGub0vmhjSIwCW7peby5tPZOZo+X5JPB1Om/aFyJiI0B5Plm6V9U7U/vmadqb0Isaq7axIJn5QvkPdwb4PJ1jvZCafwxcGBEDU9rPWleZf0HpP6uIWEXnh+2XM/NrpXlZH+fpal7ux3lSZv4EeJDOqZ/5bqfJfZlvvddk5onseAP4Igs/xo2+L9oYEgeBbWXUwSCdC1N7e7XxiDgvIs6fnAauAg6XGnaUbjvonOultN9URjBcCZwqHwf3A1dFxNry0f4qOuc7TwAvR8SVZcTCTV3rqqsXNVZtY0Em3/DFh+gc68nt3FBGslwMbKNzMW/a90f5repB4MMV+z9Z84eBb5f+s9UWwBeAJzPz012zlu1xrqp5mR/n9RFxYZk+h841lCcXsJ0m92W+9X6/64d3AB/k7GO8dO+L+VxkWSkPOqMBfkDnvOSf9Xjbl9AZ/fA94Mjk9umcv3wAeAr4R+Ci0h7AZ0utjwNDXev6A2CkPG7uah8qb6AfAv+LhV1E/Qqd0wZv0jln+bFe1Fi1jRo1/59S02PlP8DGrv5/VrZ/lK4RYFXvj/Jv93DZl78DVpf2t5XXI2X+JXOs9710Ps4/Bhwqj+uW83GeoeblfJz/E/AvpbbDwJ8vdDtN7csC6/12OcaHgf/LL0ZALen7wttySJIqtfF0kySpIYaEJKmSISFJqmRISJIqGRKSpEqGhCSpkiEhSar0/wFjTekMUNS1oQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(\n",
    "    range(len(item_value_counts)),\n",
    "    item_value_counts\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 1149780 entries, 0 to 1149779\n",
      "Data columns (total 3 columns):\n",
      " #   Column       Non-Null Count    Dtype  \n",
      "---  ------       --------------    -----  \n",
      " 0   user_id      1149780 non-null  int64  \n",
      " 1   item_id      1149780 non-null  object \n",
      " 2   book_rating  1149772 non-null  float64\n",
      "dtypes: float64(1), int64(1), object(1)\n",
      "memory usage: 26.3+ MB\n"
     ]
    }
   ],
   "source": [
    "df_rating.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 122,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "<ipython-input-122-bee590dde1e8>:1: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  df_rating['book_rating'] = df_rating['book_rating'].astype(int)\n"
     ]
    }
   ],
   "source": [
    "df_rating['book_rating'] = df_rating['book_rating'].astype(int)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 123,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 1149772 entries, 0 to 1149779\n",
      "Data columns (total 3 columns):\n",
      " #   Column       Non-Null Count    Dtype \n",
      "---  ------       --------------    ----- \n",
      " 0   user_id      1149772 non-null  int64 \n",
      " 1   item_id      1149772 non-null  object\n",
      " 2   book_rating  1149772 non-null  int32 \n",
      "dtypes: int32(1), int64(1), object(1)\n",
      "memory usage: 30.7+ MB\n"
     ]
    }
   ],
   "source": [
    "df_rating.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###  合并两个用户表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_data = pd.merge(\n",
    "    df_user,\n",
    "    df_rating,\n",
    "    on= 'user_id',\n",
    "    how = 'inner'\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 125,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 1149772 entries, 0 to 1149771\n",
      "Data columns (total 5 columns):\n",
      " #   Column       Non-Null Count    Dtype \n",
      "---  ------       --------------    ----- \n",
      " 0   user_id      1149772 non-null  int64 \n",
      " 1   location     1149772 non-null  object\n",
      " 2   age          1149772 non-null  int64 \n",
      " 3   item_id      1149772 non-null  object\n",
      " 4   book_rating  1149772 non-null  int32 \n",
      "dtypes: int32(1), int64(2), object(2)\n",
      "memory usage: 88.2+ MB\n"
     ]
    }
   ],
   "source": [
    "df_data.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_data['age'] = df_data['age'].astype(int)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 保存表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 127,
   "metadata": {},
   "outputs": [],
   "source": [
    "import _pickle as cPickle"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 128,
   "metadata": {},
   "outputs": [],
   "source": [
    "cPickle.dump(\n",
    "    df_data,\n",
    "    open('./data1/df_data.pkl','wb')\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 129,
   "metadata": {},
   "outputs": [],
   "source": [
    "object1 = cPickle.load(\n",
    "    open('./data1/df_data.pkl','rb')\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 130,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "      <th>item_id</th>\n",
       "      <th>book_rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "      <td>0195153448</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>7</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>034542252</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0002005018</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0060973129</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0374157065</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id location  age     item_id  book_rating\n",
       "0        2      usa    3  0195153448            0\n",
       "1        7      usa    0   034542252            0\n",
       "2        8   canada    0  0002005018            5\n",
       "3        8   canada    0  0060973129            0\n",
       "4        8   canada    0  0374157065            0"
      ]
     },
     "execution_count": 130,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "object1.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
